加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

在调试快速分叉并执行另一个程序的多线程程序时,GDB会爆炸

发布时间:2020-12-14 19:24:19 所属栏目:Java 来源:网络整理
导读:我正在使用GDB调试我的C程序,它有点不稳定,可能是因为我没有使用glibc,所以它不会检测新线程,直到它们中断.我通过添加一个立即恢复的断点来修复此问题(如果为0则中断). 然而今天我遇到了一堵墙. 我需要execve()非常快,所以普通的fork()是不可能的(将使用大量
我正在使用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

编辑3:也只是用gdb 7.5检查.同样的问题.

解决方法

发现问题了!显然,当克隆显然gdb(或libthread)用作产生子进程(fork样式)而不仅仅是另一个线程的提示时,我忘了用SIGCHLD屏蔽标志.谢谢@R ..的提示引导我朝着正确的方向前进.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读