【问题标题】:GDB reports a crash but program runs fineGDB 报告崩溃但程序运行正常
【发布时间】:2013-01-30 12:38:31
【问题描述】:

我有一个程序,当我从终端(没有 GDB)运行时会打印一些输出。假设输出看起来像

welcome to CMP simulator
initializing
finish initialization
now run
goodbye

现在,当我想使用 GDB 时,程序会给出一个 PID,我用它来附加到 GDB。假设程序的输出现在看起来像

welcome to CMP simulator
gdb - 5932    (Run this command on another terminal and type "continue" at GDB prompt)

当程序等待 SIGCONT 时,我在另一个终端上运行 gdb - 5932。当我输入“继续”时,GDB 会报告如下崩溃:

Loaded symbols for /home/mahmood/results/temp/libCMP_iface_gcc.so
0x00007fd3a499fb7b in raise (sig=<optimized out>) at ../nptl/sysdeps/unix/sysv/linux/pt-raise.c:42
42      ../nptl/sysdeps/unix/sysv/linux/pt-raise.c: No such file or directory.
(gdb) c
Continuing.

Program received signal SIGSTOP, Stopped (signal).
[Switching to Thread 0x7fd3a343f700 (LWP 21014)]
0x00007fd3a408e303 in __GI___poll (fds=<optimized out>, nfds=<optimized out>, timeout=<optimized out>)
     at ../sysdeps/unix/sysv/linux/poll.c:87
87      ../sysdeps/unix/sysv/linux/poll.c: No such file or directory.
(gdb) bt
#0  0x00007fd3a408e303 in __GI___poll (fds=<optimized out>, nfds=<optimized out>, timeout=<optimized out>)
     at ../sysdeps/unix/sysv/linux/poll.c:87
#1  0x00007fd3a4c0fc4c in ?? () from /home/mahmood/simics-3.0.31/amd64-linux/bin/libsimics-common.so
#2  0x00007fd3a4997e9a in start_thread (arg=0x7fd3a343f700) at pthread_create.c:308
#3  0x00007fd3a4099cbd in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:112
#4  0x0000000000000000 in ?? ()
(gdb)

此时程序仍在等待SIGCONT。

回溯是什么意思? 正如您在没有 GDB 的情况下看到的那样,程序在输出上打印更多行。但是 GDB 显示崩溃。我的猜测是创建线程存在问题。

感谢任何反馈。

更新:

如果我再次运行“继续”,我会在 GDB 上看到相同的输出

 (gdb) c
 Continuing.

 Program received signal SIGSTOP, Stopped (signal).
 0x00007f09b653c303 in __GI___poll (fds=<optimized out>, nfds=<optimized out>,  timeout=      <optimized out>)
    at ../sysdeps/unix/sysv/linux/poll.c:87
 87      in ../sysdeps/unix/sysv/linux/poll.c
 (gdb) bt
 #0  0x00007f09b653c303 in __GI___poll (fds=<optimized out>, nfds=<optimized out>, timeout=<optimized out>)
     at ../sysdeps/unix/sysv/linux/poll.c:87
 #1  0x00007f09b70bdc4c in ?? () from /home/mahmood/simics-3.0.31/amd64-linux/bin/libsimics-common.so
 #2  0x00007f09b6e45e9a in start_thread (arg=0x7f09b58ed700) at pthread_create.c:308
 #3  0x00007f09b6547cbd in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:112
 #4  0x0000000000000000 in ?? ()
 (gdb)

系统是ubuntu 12.04 amd64

【问题讨论】:

  • 它不会显示崩溃,它会显示一个信号 - 这可能非常适合您的应用程序。 SIGSTOP 是在使用 CTRL-Z 停止程序时发生的情况,但也可以通过其他方式完成。
  • 不得不说,在另一台机器上没有问题,gdb成功发送SIGCONT。所以可以看到程序的额外输出。为什么现在不继续了?
  • 尝试另一个继续。这可能是某种竞争条件,或者诸如此类 - 不知道你正在使用什么机器等等,很难说。但要明确一点,这是一个信号,但不是崩溃!
  • 当 SIGSTOP 或 SIGTSTP 被发送到一个进程时,通常的行为是将该进程暂停在其当前状态。该进程只有在收到 SIGCONT 信号时才会恢复执行。 SIGSTOP 和 SIGCONT 用于 Unix shell 中的作业控制,以及其他用途

标签: c++ linux gdb


【解决方案1】:

pt-raise.c: 没有这样的文件或目录

这个错误可以通过从源代码重建 gdb 来修复

【讨论】:

    【解决方案2】:

    GDB 没有显示崩溃,SIGSTOP 只是意味着程序已停止,您只需使用 gdb 命令“继续”继续它,或者只是要求 GDB 使用“sig SIGCONT”发送信号

    希望能帮到你。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-22
      • 2020-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-12
      • 1970-01-01
      • 2015-01-30
      相关资源
      最近更新 更多