2012-11-26 18 views
4

我正在用GDB调试我的C程序,它有点不整洁,可能是因为我没有使用glibc,所以它没有检测到新的线程直到它打破它们。我通过添加一个立即恢复的断点来解决此问题(如果为0,则中断)。当调试多线程程序,快速叉和执行另一个程序时GDB爆炸

但今天我遇到了一堵墙。我需要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

如果您删除'CLONE_VM'标志,问题是否消失? –

回答

2

发现问题!显然,我忘了在克隆时使用SIGCHLD屏蔽标志,显然gdb(或libthread)用作产生子进程(fork style)的提示而不仅仅是另一个线程。感谢@R ..提示,让我走向正确的方向。