我正在使用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运行正常但我需要它来调试我的程序。我试图禁用我能找到的每个fork和exec设置但是没有启用“follow exec”之类的东西。你可以看到它试图在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:也只是用gdb 7.5检查。同样的问题。
答案 0 :(得分:3)