1. ホーム
  2. linux

[解決済み] プログラムのコアダンプファイルがコマンドラインパラメータを持つ場合、GDBでどのように解析しますか?

2022-04-17 10:35:12

質問

私のプログラムはこのように動作します。

exe -p param1 -i param2 -o param3

クラッシュしてコアダンプファイルが生成されました。 core.pid .

でコアダンプファイルを解析したい。

gdb ./exe -p param1 -i param2 -o param3 core.pid

しかし、GDBはEXEファイルのパラメータをGDBの入力として認識します。

このような場合、コアダンプファイルをどのように解析すればよいのでしょうか?

どのように解決するのですか?

GDBでコアを使う方法はいろいろありますが、実行ファイルに渡すべきパラメータをGDBに渡すのは、コアファイルを使う方法とは異なります。これは、あなたがそのエラーを得た理由である可能性もあります。コアファイルの使い方は以下の通りです。

gdb <executable> <core-file> または gdb <executable> -c <core-file> または

gdb <executable>
...
(gdb) core <core-file>

coreファイルを使用する場合は、引数を渡す必要はありません。GDBでクラッシュのシナリオが表示されます(UbuntuのGDBバージョン7.1で確認)。

例えば

$ ./crash -p param1 -o param2
Segmentation fault (core dumped)
$ gdb ./crash core
GNU gdb (GDB) 7.1-ubuntu
...
Core was generated by `./crash -p param1 -o param2'. <<<<< See this line shows crash scenario
Program terminated with signal 11, Segmentation fault.
#0  __strlen_ia32 () at ../sysdeps/i386/i686/multiarch/../../i586/strlen.S:99
99    ../sysdeps/i386/i686/multiarch/../../i586/strlen.S: No such file or directory.
    in ../sysdeps/i386/i686/multiarch/../../i586/strlen.S
(gdb)

GDBでデバッグする実行ファイルにパラメータを渡したい場合は --args .

例えば

$ gdb --args ./crash -p param1 -o param2
GNU gdb (GDB) 7.1-ubuntu
...
(gdb) r
Starting program: /home/@@@@/crash -p param1 -o param2

Program received signal SIGSEGV, Segmentation fault.
__strlen_ia32 () at ../sysdeps/i386/i686/multiarch/../../i586/strlen.S:99
99    ../sysdeps/i386/i686/multiarch/../../i586/strlen.S: No such file or directory.
    in ../sysdeps/i386/i686/multiarch/../../i586/strlen.S
(gdb)

他のGDBオプションを見るには、Manページが役に立つでしょう。

最も便利なコマンドは

  • bt (バックトレース)
  • info locals (ローカル変数の値を表示します。)
  • info registers (CPUのレジスタの値を表示します。)
  • frame X (スタックフレームへの変更 X )
  • updown (スタックフレーム(コールチェーン)内を移動する)。