繁体   English   中英

gdb 调试器在 popen()、“信号 SIGTRAP、跟踪/断点陷阱”上过早退出?

[英]gdb debugger quits prematurely on popen(), 'signal SIGTRAP, Trace/breakpoint trap'?

以下代码在独立(非调试)模式下工作。 但是,当我尝试跳过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);
}

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM