16

起動時に別のプロセス (P) を生成する C Linux アプリケーション (A) があります。PI をデバッグする場合は、通常どおり A を開始し、ddd/gdb で P に接続します。

P のエントリポイント (メインの開始) をデバッグしたいときに問題が発生します。デバッガーを P に接続するときに通常のアプローチに従うと、既に手遅れです。私が見つけた解決策は、P のメインの先頭にスリープを挿入することでした。これにより、gdb に接続する時間ができましたが、これはあまりエレガントな解決策ではありません。

私も使用してみましasm("int $3")たが、うまくいかないようです。

どうすればこの問題を解決できるか分かりますか? (できれば A または P のコードを変更しないでください)

4

5 に答える 5

21

このオプションを使用する必要があります。

set follow-fork-mode モード

モードは、またはのいずれかですparentchildask

親をフォローするには (これがデフォルトです)、次を使用します。

set follow-fork-mode parent

子をフォローするには:

set follow-fork-mode child

毎回デバッガーに確認させるには:

set follow-fork-mode ask

したがって、基本的には、gdb を A に接続することから始め、次に gdb を子に従うように設定します。次に、A が P を生成すると、gdb は P に接続し、A から切り離します。

于 2008-12-18T09:07:49.550 に答える
11

ネイサンフェルマンの答えに加えて、キャッチポイントは便利です、ig:

catch exec

キャッチポイントはブレークポイントとして機能します。exec() syscallの呼び出しが検出されるたびに、GDBは停止します。break mainこれにより、続行する前に、新しくロードされた実行可能ファイルにブレークポイント(ig)を設定できます。別のキャッチポイントは、 fork()システムコール検出catch forkでも同様に機能します。

特に便利です:

  • 親と子の両方をフォローする必要がある場合(set detach-on-fork off);
  • 親プロセスのフォークがさまざまな実行可能ファイルをロードすることが多い場合。
于 2012-10-30T15:07:39.643 に答える
1

execfile+のある部分break main

フォークの一部は、https ://stackoverflow.com/a/377295/895245 で説明されていました。

今ではexec

交流:

#include <unistd.h>

int main(void) {
    execl("./b", "./b", "ab", "cd", (char*)NULL);
    return 1;
}

紀元前:

#include <stdio.h>

int main(int argc, char **argv ) {
    printf("%s\n", argv[0]);
    printf("%s\n", argv[1]);
}

それで:

gcc -g a.c -o a
gcc -g b.c -o b
gdb -nh -q a

対話型セッションでは:

Reading symbols from a...done.
(gdb) start
Temporary breakpoint 1 at 0x4004ea: file a.c, line 4.
Starting program: /home/ciro/test/gdb-exec/a 

Temporary breakpoint 1, main () at a.c:4
4           execl("./b", "./b", "ab", "cd", (char*)NULL);
(gdb) file b
A program is being debugged already.
Are you sure you want to change the file? (y or n) y
Load new symbol table from "b"? (y or n) y
Reading symbols from b...done.
(gdb) b main
Breakpoint 2 at 0x4004f5: file b.c, line 4.
(gdb) n

Breakpoint 2, main (argc=0, argv=0x7fffffffa570) at b.c:4
4               printf("%s\n", argv[1]);
(gdb) n
process 4877 is executing new program: /home/ciro/test/gdb-exec/b

Breakpoint 2, main (argc=3, argv=0x7fffffffa598) at b.c:4
4               printf("%s\n", argv[1]);
(gdb) n
ab
5               printf("%s\n", argv[2]);
(gdb) n
cd
6       }
(gdb) 

ファイルを実行するexec前に、おそらくb execl.

Ubuntu 14.04、gdb 7.7.1 でテスト済み。

于 2017-03-29T16:39:37.287 に答える
-1

main() にブレークポイントを設定すると、実行されたプログラムの main() でもブレークします。

于 2012-11-25T19:48:48.943 に答える
-1

これは、gdb のリモート デバッグ機能、具体的にはgdbserver. 実際には、 を使用して (P) を起動しgdbserverます。これらのリンクには、より詳細な情報があります。

于 2008-12-18T08:51:03.390 に答える