8

私は2つの簡単なプログラムを書きました:

int main(int ac, char **argv ) {
    execv( "/home/me/Desktop/execvtest2", argv );
}

int main(int ac, char **argv ) {
    execv( "/home/me/Desktop/execvtest1", argv );
}

gcc -g を使用して、それらを適切な出力ファイルにコンパイルしました。gcc (Ubuntu/Linaro 4.4.4-14ubuntu5.1) 4.4.5 を使用して Ubuntu 10.10 を実行しています。

GNU gdb (GDB) 7.2-ubuntu を使用して最初のプログラムをデバッグしているときに、最初の execv ステートメントまでステップ実行できますが、その後は 2 つのファイルが実行され続けます。follow-exec-mode を new に設定しても、2 番目のプログラムにステップ インできません。catch exec を設定すると、gdb は execv への呼び出しごとに停止します (2 番目のプログラムのリンクされたソースがないと、gdb を終了できません!?) が、できません。 「新しい」(execがプロセスを置き換えるため)下位プログラムへの呼び出しをステップオーバーします。

では、これを行うにはどうすればよいでしょうか。新しいプロセスに足を踏み入れる方法があるはずですよね?私は何か間違ったことをしていますか?

乾杯

4

2 に答える 2

9

「キャッチ」コマンドを使用できます。これにより、実行後にいくつかのブレークポイントを配置する機会が得られます

于 2012-09-12T04:55:20.563 に答える
3

私は、あなたが私のクラスで行っていることと非常によく似たことをしています。これは少しハックであり、レジスタ値などを取得しようとすると、混乱する可能性があります。GDBのドキュメントによると、実行ファイルを維持しながらシンボルファイルを変更できます。これを行うには、コマンドを使用するだけsymbol-file file2です。これは、GDB フラグ (GCC では -g) を使用してコンパイルされたバイナリ ファイルでなければならないことに注意してください。このシンボル ファイルを読み込んだ後は、元の実行ファイルの行を中断したり表示したりすることはできません。ただし、新しいシンボル ファイルにブレーク ポイントを設定することはできます。break file2.c:40そして、前と同じようにステップ実行します。バイナリ ファイルを使用して直接実行せずに、基本的に新しいプロセスの実行をキャッチし、そのバイナリ ファイルのシンボル テーブルにマッピングしているため、少しハックであり、完全に機能しない可能性があります。素晴らしい結果は得られていませんが、この方法で中間値を確認できます。別のこととして、元のファイルのデバッグに戻るには、symbol-file fileシンボル テーブルをリロードする必要があります。

于 2014-02-18T21:11:38.257 に答える