7

backtrace() と backtrace_symbols() を使用して、SIGSEGV のバックトレースとその他のシグナルを次のような形式で出力しています。

0: [0xb750818]
1: /opt/server/libQtScript.so.4(+0x6f42a) [0xb782c42a]
2: /opt/server/libQtScript.so.4(+0x7bffc) [0xb7838ffc]
3: /opt/server/libQtScript.so.4(+0x86946) [0xb7843946]
4: /opt/server/libQtScript.so.4(+0x7c4bc) [0xb78394bc]
5: /opt/server/libQtScript.so.4(+0x86946) [0xb7843946]
6: /opt/server/libQtScript.so.4(+0x9603e) [0xb785303e]
7: /opt/server/libQtScript.so.4(_ZN12QScriptValue4callERKS_RK5QListIS_E+0x2e7) [0xb7891647]

この特定のケースでは、フレーム #7 は問題ありませんが、フレーム 1 から 6 はある種の「+x」アドレスを提供します。

「+0x6f42a」およびGDBの他のアドレスの逆アセンブルで正確な行を取得するには? また、モジュールが記述されていないフレーム #0 は何を意味するのでしょうか?

4

2 に答える 2

10

「+0x6f42a」およびGDBの他のアドレスの逆アセンブルで正確な行を取得するには?

gdb /opt/server/libQtScript.so.4
(gdb) x/10i 0x6f42a

通常、0x6f42aより前に実行された命令が必要になるため、次のようにします。

(gdb) x/20i 0x6f42a-30

最初のいくつかの指示は無視してください。分解を途中から開始している可能性があります。通常、逆アセンブリはいくつかの命令の後に再同期し、その後正しい命令ストリームを表示し始めます。

また、モジュールが記述されていないフレーム #0 は何を意味するのでしょうか?

ライブラリからシンボルが取り除かれているため、表示されるシンボル (例: _ZN12QScriptValue4callERKS_RK5QListIS_E) は、外部から見える (エクスポートされた) シンボルだけです。

QT_SOURCE/lib フォルダに libQtScript.so.4.5.2.debug シンボル ファイルがあります。したがって、完全なシンボルでバックトレースを取得するには、.debug ファイルを実行可能ファイルの近くにコピーする必要がありますか?

に設定すると、GDB は からシンボルをlibQtScript.so.4.5.2.debug自動的にロードする必要があります。debug-file-directory$QT_SOURCE/lib

アップデート:

GDBをアタッチせずにシンボルを使用してバックトレースを取得することをメンターします

backtace_symbols()個別の debuginfo ファイルのロードがサポートされているとは思えません。

于 2012-04-10T14:15:45.943 に答える
0

libQTScript を debug-symbols でコンパイルした場合は、関数名とパラメーター値を使用してより適切なバックトレースを取得できます。デバッグ シンボルなしで同じ情報を抽出する方法が正確にはわかりません (libQTScript の正しいマップ ファイルまたはシンボル テーブル ファイルがあれば可能ですが)。

しかし、簡単な方法は、libqt をデバッグ シンボルとともにインストールし、バックトレースを再度実行することです。削除されたライブラリとデバッグ ライブラリの両方がインストールされていて、gdb が削除されたライブラリを選択する場合は、gdb が LD_LIBRARY_PATH=path/to/debug/libs を使用してデバッグ ライブラリを指すようにしてください。(パスを設定する別の方法については、この回答を参照してくださいLinux の gdb にコア ファイルをロードするときにライブラリ パスにディレクトリを追加する方法)

于 2012-04-10T13:46:24.163 に答える