颜子鱼 2024-08-08 18:50 采纳率: 0%
浏览 15

gdb调试多进程,set detach-on-fork off后用breakpoint打断点,报警告无法正常调试。

gdb调试多进程,set detach-on-fork off后用breakpoint打断点,报警告无法正常调试。
###c
Reading symbols from GDB_fork_test...done.
(gdb) b 21
Breakpoint 1 at 0x7d2: file GDB_fork_test.c, line 21.
(gdb) set detach-on-fork off
(gdb) start
Temporary breakpoint 2 at 0x7ba: file GDB_fork_test.c, line 9.
Starting program: /home/book/Linux_application/my_test/GDB_fork_test

Temporary breakpoint 2, main (argc=1, argv=0x7fffffffdc98) at GDB_fork_test.c:9
9 printf("父进程开始,id为%d\n",getpid());
(gdb) c
Continuing.
父进程开始,id为13219

Breakpoint 1, main (argc=1, argv=0x7fffffffdc98) at GDB_fork_test.c:21
21 pid_t pid = fork();
(gdb) n
[New process 13249]
Reading symbols from /home/book/Linux_application/my_test/GDB_fork_test...done.
Warning:
Cannot insert breakpoint 1.
Cannot access memory at address 0x7d2
###

  • 写回答

2条回答 默认 最新

  • 一直免费一直爽 2024-08-11 23:24
    关注

    以下回复参考:皆我百晓生券券喵儿等免费微信小程序作答:

    在GDB调试Linux环境下调试多个进程时,遇到set detach-on-fork off后使用breakpoint打断点,导致无法正常调试的情况,主要是因为detach-on-fork选项阻止了GDB对子进程的控制,从而使得中断点无法正确地触发。

    要解决这个问题,可以尝试以下方法:

    1. 修改breakpoint语句

      • 如果你想在所有进程中都设置一个全局的中断点,那么你需要将breakpoint语句更改为:b *0x7ba, 这样可以让GDB在整个进程中都能找到并处理这个中断点。
      • 如果你想针对特定进程设置中断点,可以考虑将中断点添加到每个进程的主函数中(例如,在main()函数之前),这样当某个进程执行fork()操作时,GDB就能在它的上下文中识别出这个中断点。
    2. 使用-ex参数

      • start命令之后加上 -ex break 21 或者 --ex "break 21" 可以强制GDB进入调试模式,并立即跳转到指定的中断点位置。
    3. 利用-q或者--quiet开关

      • 使用-q或者--quiet开关可以在不显示任何调试信息的情况下继续程序的运行,这有助于快速定位问题,但可能会错过一些细节。
    4. 记录日志

      • 使用--trace选项可以记录GDB的所有行为,包括每次调用、断点、退出等,这对于追踪问题非常有帮助。
    5. 使用-t或者--thread-list开关

      • 使用-t或者--thread-list开关可以查看当前正在运行的线程列表,这对排查问题也很有用。
    6. 使用-v或者--version开关

      • 使用-v或者--version开关可以帮助你检查GDB版本以及相关依赖项是否满足需求。
    7. 重启GDB

      • 在某些情况下,可能是因为GDB本身的问题导致无法正常调试,此时重启GDB可能是解决问题的一种方式。

    通过上述步骤,你应该能够有效地解决set detach-on-fork off后使用breakpoint打断点而引发的无法正常调试的问题。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 8月8日