gpt4 book ai didi

c - 段错误 : how to know in which line code or function that caused this segfault

转载 作者:行者123 更新时间:2023-11-30 20:27:17 25 4
gpt4 key购买 nike

当在 openwrt 设备中执行我的程序时,我收到此消息:

prog[876]: segfault at 3000747a0 ip 08052d3f sp bfca6a0c error 4 prog[8048000+f000]

我的目的是知道哪一行代码或函数导致了这个段错误

可以从消息中获取它吗?或者是否有其他方法可以做到这一点?

最佳答案

正如评论中提到的,使用调试符号进行编译并在稍后的核心转储上运行 gdb 是获取所需信息的一种方法。如果您熟悉 gdb,那么使用它是一种通用、快速且直接的方法来定位与段错误消息中给出的位置相对应的代码,特别是当该位置位于您的代码中而不是库中时。

如果您不熟悉 gdb,您可以使用以下替代方案。对于这种替代方案,您需要一个输出控制台或日志设备;我认为您的 OpenWrt 嵌入式设备可以使用其中之一。

使用以下行创建头文件,或将其添加到现有头文件中:

#define z fprintf(stderr,"%s@%3d \n",__FILE__,__LINE__);

注意,将标识符 z 替换为其他短标识符(例如 Zocry 等) ) 如果您在代码中使用 z 作为变量名。如果合适,请将 fprintf 替换为 syslog 调用。在行尾使用分号可将使用分号所需的键入减少到每行一个字符。

将行放入头文件中后,在任何有问题的代码文件中#include,在几个函数的开头附近添加字符z(或任何短标识符您在一行代码的前面选择了),然后编译并运行该代码。当代码执行并遇到 z 代码时,它将打印出当前文件和当前行号。随着每次运行缩小可疑代码范围,您可以从该范围之外删除一些 z 代码,并在可疑范围内更密集地添加 z 代码。

如果段错误是由于覆盖内存(例如堆栈或堆的一部分)引起的,则添加任何调试代码(如上所述)可能会不可预测地移动问题出现的位置。在这种情况下,您可以依靠 gdb。但是,有时向 z 宏添加更多代码可能会有所帮助,例如打印出任何相关全局变量的值,或者测试某些内存范围是否仍然满足某些有效性标准或测试某些变量的值是否已更改。例如:

#define z fprintf(stderr,"%s@%3d \n",__FILE__,__LINE__); testfvalid();
#define z fprintf(stderr,"%s@%3d %d %p %d %d\n",__FILE__,__LINE__, i, fde+i, fde[i].path, fde[i].name);

关于c - 段错误 : how to know in which line code or function that caused this segfault,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20953935/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com