5

私はGDBを使用してCプログラムをデバッグしていますが、おそらくglibcを使用していないため、新しいスレッドが中断されるまで検出されないため、少し不安定です。すぐに再開するブレークポイントを追加することでこれを修正しました(0の場合はブレーク)。

しかし今日、私は壁にぶつかりました。

私は本当に速くexecve()する必要があるので、通常のfork()は問題外であり(大量のメモリを使用します)、vfork()はできません(パイプなどをセットアップするためにスタックが必要です)ので、同じものを使用しましたこのライブラリ(https://code.google.com/p/popen-noshell/)のようなメソッドで、基本的にCLONE_VMでのみクローンを作成します。これ(または一般的にexecve()を呼び出す-私は本当に知りません)は、何らかの理由でGDBを本当に混乱させます-基本的には次のようなものを出力します:

[New LWP 516]
[New LWP 520]
[New LWP 519]
[New LWP 521]
LWP 521 is executing new program: /bin/bash
Error in re-setting breakpoint 1: No source file named xxx.c.
Error in re-setting breakpoint 2: No source file named yyy.c.
Error in re-setting breakpoint 4: Function "zzz_main" not defined.
[LWP 521 exited]

Program received signal SIGTRAP, Trace/breakpoint trap.
[Switching to LWP 519]
0x00000000004307f8 in shell_execve ()
(gdb) info threads 
Id   Target Id         Frame 
* 5    LWP 519 "self-tes" 0x00000000004307f8 in shell_execve ()
4    LWP 520 "self-tes" 0x000000000040825f in ?? ()
3    LWP 516 "self-tes" 0x000000000040825f in ?? ()
2    LWP 515 "self-tes" 0x000000000040825f in ?? ()
1    LWP 512 "self-tes" 0x000000000040848a in ?? ()

GDBは基本的にすべてについて混乱し、現在/ bin / bashを実行していると思います-そうではありません-GDBなしで実行すると正常に動作しますが、プログラムをデバッグするために必要です。見つけたすべてのフォークとexec設定を無効にしようとしましたが、「followexec」のようなものは有効になりません。ご覧のとおり、execve()の後にブレークポイントをリセットしようとします...なぜですか?前のスペースを完全に消去し、代わりに/ bin / bashをロードしたため、フレームやシンボルを認識しなくなりました。

GDBにexecve()を呼び出すスレッドを無視させ、サブプロセスのシンボルをロードしようとしないようにするにはどうすればよいですか?

編集:ああ、私は現在x86_64 Linux 3.2.0-27(Ubuntu)を使用しています。

EDIT2:GNU gdb(Ubuntu / Linaro 7.4-2012.04-0ubuntu2)7.4-2012.04

EDIT3:gdb7.5でもチェックしました。同じ問題。

4

1 に答える 1

3

問題が見つかりました!どうやら、クローン作成時にSIGCHLDでフラグをマスクするのを忘れたようです。これは、gdb(またはlibthread)が、別のスレッドだけでなく、サブプロセス(フォークスタイル)を生成するためのヒントとして使用しているようです。正しい方向に私を導くヒントを@R..に感謝します。

于 2012-11-26T05:51:30.953 に答える