c - 如何检测堆栈溢出点

标签 c linux gdb stack-overflow callstack

我的 C 程序有以下问题:某处发生堆栈溢出。尽管在没有优化和使用调试器符号的情况下进行编译,但程序会以以下输出退出(在 Linux 上的 gdb 内部或外部):

程序因信号 SIGSEGV、段错误而终止。 该程序不再存在。

我能检测到这实际上是堆栈溢出的唯一方法是通过 valgrind 运行程序。有什么方法可以强制操作系统转储调用堆栈跟踪以帮助我找到问题?

遗憾的是,gdb 也不允许我轻松进入该程序。

最佳答案

如果您允许系统转储核心文件,您可以使用 gdb 分析它们:

$ ulimit -c unlimited # bash sentence to allow for infinite sized cores
$ ./stack_overflow
Segmentation fault (core dumped)
$ gdb -c core stack_overflow
gdb> bt
#0  0x0000000000400570 in f ()
#1  0x0000000000400570 in f ()
#2  0x0000000000400570 in f ()
...

有时我看到生成错误的核心文件有不正确的堆栈跟踪,但在大多数情况下,bt 会产生一堆对同一方法的递归调用。

核心文件可能有不同的名称,其中可能包含进程 ID,这取决于您当前系统中内核的默认配置,但可以通过(以 root 身份运行或使用 sudo)进行控制:

$ sysctl kernel.core_uses_pid=1

关于c - 如何检测堆栈溢出点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/742200/

相关文章:

linux - 使用 shell 脚本从出现在网页顶部的弹出窗口中提取 urls 链接?

linux - 如何从 SNMP 获取每秒接收和发送的数据字节数

python - 无法在 macOS 上使用 gdb 调试 tensorflow

c - 字符串矩阵中的字符串分配(不是在声明时)

c++ - VS2012 混合 C 和 Cpp,库冲突

C、字符串数组不会弃用从字符串常量到 'char*' 的转换

C - 递归后返回

linux - 如何使用Bash测试hdfs文件是否存在

c++ - 如何读取 gdb 中的内存地址以进行 i7 处理器代码反汇编?

gdb宏确定被调试程序的体系结构