【问题标题】:gdb debugger quits prematurely on popen(), 'signal SIGTRAP, Trace/breakpoint trap'?gdb 调试器在 popen()、“信号 SIGTRAP、跟踪/断点陷阱”上过早退出?
【发布时间】:2022-01-05 09:46:00
【问题描述】:

以下代码在独立(非调试)模式下工作。但是,当我尝试跨过popen() 时,gdb 调试停止,这意味着永远无法到达fgets() 处的断点。

#include <stdio.h>

int main()
{
    char buff[10];
    FILE *f = popen("echo blah", "r");
    // program and debugger exit before this line
    // so that fgets() and printf() were never called
    fgets(buff, 5, f);
    printf("%s\n", buff);
}

GDB 报告 Program terminated with signal SIGTRAP, Trace/breakpoint trap. 我挖到了 glibc 的 popen(),这就是它退出的地方,

// internal-signal.h
/* Block all signals, including internal glibc ones.  */
static inline void
__libc_signal_block_all (sigset_t *set)
{
  INTERNAL_SYSCALL_CALL (rt_sigprocmask, SIG_BLOCK, &sigall_set, set,
             __NSIG_BYTES);
}

有人知道这里发生了什么吗?谢谢!

【问题讨论】:

  • 谢谢!我认为您的链接与我遇到的问题非常相关。在纸面上,我认为我需要的是 -gdb-set detach-on-fork on-gdb-set follow-fork-mode parent,这应该是默认的 gdb 设置。尽管如此,我尝试明确设置on/offparent/child 的所有四种组合,但到目前为止都没有工作......

标签: c++ c debugging gdb popen


【解决方案1】:

原来是内核问题,至少当我从 5.15.x 恢复到 5.14.x 时,问题就消失了。我认为内核更新永远不会破坏用户空间。

【讨论】:

    猜你喜欢
    • 2018-05-20
    • 2012-04-06
    • 2018-08-31
    • 2011-05-26
    • 2022-01-02
    • 1970-01-01
    • 1970-01-01
    • 2013-06-02
    • 1970-01-01
    相关资源
    最近更新 更多