共有ライブラリから関数名とクラッシュの原因を取得する方法を教えてください。 私は共有ライブラリにフルアクセスできます。私は別のフラグ、さらには主なソースでもそれを再コンパイルすることができます。私にそれをする方法を教えてください?サードパーティのアプリケーションを使用しない共有ライブラリへのバックトレース
現在、私は信号ハンドラ内にバックトレース機能を実装していますが、メイン関数のトレースを提供していますが、共有ライブラリのトレースは提供していません。
共有ライブラリから関数名とクラッシュの原因を取得する方法を教えてください。 私は共有ライブラリにフルアクセスできます。私は別のフラグ、さらには主なソースでもそれを再コンパイルすることができます。私にそれをする方法を教えてください?サードパーティのアプリケーションを使用しない共有ライブラリへのバックトレース
現在、私は信号ハンドラ内にバックトレース機能を実装していますが、メイン関数のトレースを提供していますが、共有ライブラリのトレースは提供していません。
glibcを使用していると仮定すると、シグナルを捕まえてスタックトレースを出力するために、libSegFaultライブラリをLD_PRELOADできます。
$ LD_PRELOAD=/lib/libSegFault.so ./a.out
ライブラリを再コンパイルするときは、-gフラグを使用します。通常、これはMakefileのCFLAGSやCPPFLAGSのようなもので行われます。さらに、バイナリでgdbを実行する前に、LD_LIBRARY_PATHに共有ライブラリのデバッグバージョンへのパスを含めるように設定する必要があります(LD_LIBRARY_PATHに他のアイテムが存在する場合、エントリが先頭にあることを確認してください)。最後に、ソースコードを見つけてブレークポイントを設定できるように、ソースを作業ディレクトリにコピーすることができます。
"core dump"と "gdb"を検索します。 –
...デバッグシンボルでコンパイルすることを忘れないでください。そうしないと、トレースにはメモリアドレスだけが含まれます。 – Jens