gdb 调试器在 popen() 上过早退出,'signal SIGTRAP, Trace/breakpoint trap'?
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);
}
有人知道这里发生了什么吗?谢谢!
原来是内核问题,至少当我从 5.15.x 恢复到 5.14.x 时,问题就消失了。我认为内核更新永远不会破坏用户空间。
以下代码在独立(非调试)模式下工作。但是,当我尝试跨过 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);
}
有人知道这里发生了什么吗?谢谢!
原来是内核问题,至少当我从 5.15.x 恢复到 5.14.x 时,问题就消失了。我认为内核更新永远不会破坏用户空间。