gpt4 book ai didi

c - GDB 在调试快速 fork 并执行另一个程序的多线程程序时崩溃

转载 作者:IT王子 更新时间:2023-10-29 00:36:13 35 4
gpt4 key购买 nike

我正在使用 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。同样的问题。

最佳答案

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

关于c - GDB 在调试快速 fork 并执行另一个程序的多线程程序时崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13558108/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com