共有ライブラリでランタイムデバッグを行う方法を教えてもらえますか?ランタイムデバッグ共有ライブラリの方法は?
共有ライブラリの関数を実行時にデバッグする必要がありますが、別のプログラムから呼び出されます。 共有ライブラリでdbxのようなことをするにはどうすればよいですか?
AIXではdbxを使用しています。 は何をしようとしているのですか?
共有ライブラリでランタイムデバッグを行う方法を教えてもらえますか?ランタイムデバッグ共有ライブラリの方法は?
共有ライブラリの関数を実行時にデバッグする必要がありますが、別のプログラムから呼び出されます。 共有ライブラリでdbxのようなことをするにはどうすればよいですか?
AIXではdbxを使用しています。 は何をしようとしているのですか?
実行可能ファイルでgdbを呼び出すだけです(あなたやサードパーティのプログラムであれば問題ありません)。ここでは、lsコマンドをデバッグし、(共有)Cライブラリにブレークポイントを設定する例を示します。あなたはGDBが自動的に実行可能で使用されるすべてのスレッドを管理して見ることができるように
gdb /bin/ls
GNU gdb 6.8-debian
Copyright (C) 2008 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu"...
(no debugging symbols found)
(gdb) b write
Function "write" not defined.
Make breakpoint pending on future shared library load? (y or [n]) y
Breakpoint 1 (write) pending.
(gdb) r
Starting program: /bin/ls
(no debugging symbols found)
(no debugging symbols found)
(no debugging symbols found)
(no debugging symbols found)
(no debugging symbols found)
(no debugging symbols found)
(no debugging symbols found)
[Thread debugging using libthread_db enabled]
(no debugging symbols found)
(no debugging symbols found)
[New Thread 0x7f98d2d23780 (LWP 7029)]
[Switching to Thread 0x7f98d2d23780 (LWP 7029)]
Breakpoint 1, 0x00007f98d2264bb0 in write() from /lib/libc.so.6
(gdb)
:この例では、これが容易になります(保留)のブレークポイントを延期サポートGDB 6.8を使用しています。スレッドに特別なことをする必要はありません。ブレークポイントはどのスレッドでも動作します。すでに実行中のアプリケーションにデバッガをアタッチする場合
は、代わりに(私が使用しtail -fの例として、ここでは/ tmpは/ TTT):それは私から長い時間となっている
ps ux | grep tail
lothar 8496 0.0 0.0 9352 804 pts/3 S+ 12:38 0:00 tail -f /tmp/ttt
lothar 8510 0.0 0.0 5164 840 pts/4 S+ 12:39 0:00 grep tail
gdb
GNU gdb 6.8-debian
Copyright (C) 2008 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu"...
(no debugging symbols found)
(gdb) attach 8496
Attaching to program: /usr/bin/tail, process 8496
Reading symbols from /lib/librt.so.1...(no debugging symbols found)...done.
Loaded symbols for /lib/librt.so.1
Reading symbols from /lib/libc.so.6...(no debugging symbols found)...done.
Loaded symbols for /lib/libc.so.6
Reading symbols from /lib/libpthread.so.0...(no debugging symbols found)...done.
[Thread debugging using libthread_db enabled]
[New Thread 0x7f24853f56e0 (LWP 8496)]
Loaded symbols for /lib/libpthread.so.0
Reading symbols from /lib/ld-linux-x86-64.so.2...
(no debugging symbols found)...done.
Loaded symbols for /lib64/ld-linux-x86-64.so.2
(no debugging symbols found)
0x00007f2484d2bb50 in nanosleep() from /lib/libc.so.6
(gdb) b write
Breakpoint 1 at 0x7f2484d57bb0
(gdb) c
Continuing.
[Switching to Thread 0x7f24853f56e0 (LWP 8496)]
Breakpoint 1, 0x00007f2484d57bb0 in write() from /lib/libc.so.6
(gdb)
通常、共有ライブラリをデバッグする手順は、実行可能ファイルをデバッグする場合とほぼ同じです。主な違いは、共有ライブラリがメモリにロードされるまでブレークポイントを設定できないことがあることです。メイン実行可能ファイルにデバッガをアタッチします。
あなたが所有していないがプラグインアーキテクチャでモジュールを使用しているアプリケーションをデバッグする場合でも、同じ方法を使用します。共有ライブラリ用のデバッグ情報があることを確認してください(いつものように)。ウィンドウでは、.pdbファイルを生成します。 gccでは、デバッグ情報が確実に提供されるように特別なコンパイラフラグ(-g?)を指定すると思います。サードパーティのアプリケーションにデバッガを接続します。
主な実行ファイルが私のものではなく、いくつかのサードパーティの.... でも、サードパーティが使用するモジュールを書いています... どうすればデバッグできますか? –
gdbで実行可能ファイルを開始(またはプロセスにアタッチ)します。ライブラリがロードされた後、gdbは問題なくブレークポイントを設定できます。 – lothar
しかし、共有のlibコードにブレークポイントを設定し、メインの実行ファイルがそれを呼び出すと、メインの実行ファイルはブロックされませんか? –
共有ライブラリのテストは、それを使った模擬アプリケーションを作成することで覚えています。たくさんの作業をしたい場合は、ライブラリをサードパーティのアプリケーションでどのように使用しているかに関する情報を収集し、モックアプリケーションでその情報を再生させる、モック共有ライブラリを作成することができます。
もちろん、printfとfprintfの呼び出しがうまくいっているかどうかは疑いありません。
ライブラリを静的にコンパイルしてリンクして、デバッグすることができます。
あなたのバグが共有としてコンパイルされている場合にのみ表示される場合、それはあなたにいくつかの手がかりを与えるかもしれません。
AIX上でdbxを使用する必要がありましたが、私もこの問題に直面しました。 gdbのインストールは私の選択肢ではありませんでした。
dbx /path/to/your/program
(dbx) run [args to your program]
(dbx) set $ignoreonbptrap # I kept hitting a trace/bpt trap
(dbx) set $deferevents # allows setting bp in not loaded shared library
(dbx) set $repeat # useful, repeat commands with <enter> tjust like gdb
(dbx) stop in MySharedLibraryFunc # defers breakpoint
(dbx) cont
ローターの答えにさらにもう一つの例:私は動的ライブラリtest.so
上でテストを実行している
(test.c
からコンパイル)のLinuxでtests/test_pwmbasic.py
呼ばpython
とPythonのユニットテストのライブラリunittest
を使用。(スキームを命名すると、私は今、実現し、ビット単調である)
~/my/test/path/
tests/
__init__.py
test_pwmbasic.py
test.c
test.so
私はtest_pwmbasic.py
に刺激からtest.so
に何があるかデバッグしたいです。 これは...私はそれが働いて得た方法
$ cd ~/my/test/path
$ gdb $(which python)
... gdb blah ...
(gdb) b test.c:179
(gdb) run
>>> from tests.test_pwmbasic import *
>>> import unittest
>>> unittest.main()
... unittest blah ...
Breakpoint 1, pwmTest_setDutyCycles (dutyCycles=0x7ffff7ece910) at ./test.c:179
(gdb) print pwm_errorCode
$1 = PWM_ERROR_NONE
で、今私は、GDB
ノート結婚したい:test.c
も../pwm.c
を含んを、私はまた
(gdb) b pwm.c:123
とそのライブラリにブレークポイントを設定することができます
AIXではdbxを使用しました。 もしgdbがスレッド化されたアプリケーションでそれを行うことができるとすれば、dbxは大きな時間を浪費します。 –
悲しいgdbがAIX上で正常に動作しない... AIXが悪い... –
dbxは分かりませんが、似たような機能を持っているはずです – lothar