linux core 调试实例


坚强踢牛排
坚强踢牛排 2022-10-08 12:23:28 50275
分类专栏: 资讯

文中提到:
大多数UNIX调试程序都使用core文件以检查进程终止时的状态。
如书上表10-1所示,当进程接收到例如SIGABRT(异常终止)、SIGBUS(硬件故障)、SIGSEGV(无效内存引用)等信号的时候会产生相应的core文件,该core文件复制了进程的存储镜像。在运行程序的时候,我们会经常遇到Segmentation fault,也就是段错误,表示该进程进行了一次无效的内存访问。对于此类情况,我们很难发现问题具体是出现在程序的哪一行,如果是一小段程序,我们可以直接用gdb一步一步跟踪调试,但是如果程序规模很大,这样做显然就不实现了。回过头来,我们发现对于此类错误,程序会接收到SIGSEGV(无效内存引用)信号,而该信号在终止程序的同时,会在当前目录产生一个相应的core文件。因此,我们可以让gdb根据该core文件分析中断的位置,也就是出现该错误的位置。首先,我们应该现查看当前系统是否开启了core文件支持(以GNU/Linux为例):
  • ~ $ ulimit -c
  • 0
  • ~ $ ulimit -c unlimited
  • ~ $ ulimit -c
  • unlimited
  • 默认情况下,core dump生成的文件名为core,而且就在程序当前目录下。新的core会覆盖已存在的core。通过修改/proc/sys/kernel/core_uses_pid文件,可以将进程的pid作为作为扩展名,生成的core文件格式为core.xxx,其中xxx即为pid 方法:sudo echo "1" > /proc/sys/kernel/core_uses_pid 通过修改/proc/sys/kernel/core_pattern可以控制core文件保存位置和文件格式。例如:将所有的core文件生成到/corefile目录下,文件名的格式为core-命令名-pid-时间戳. 方法:sudo echo "/corefile/core-%e-%p-%t" > /proc/sys/kernel/core_pattern

0表示未开启,大于0的表示默认core文件的大小,如果超过此大小,则截断,这会造成core文件的信息不完整,因此我们这里将其设置为unlimited,也就是无限大。接下来,我们写一段C代码来测试:
  • include <stdio.h>
  • char *str;
  • void core_test()
  • {
  •     printf("%c\n",*str);
  • }
  • int main(int argc, char *argv[])
  • {
  •     core_test();
  •     return 0;
  • }

然后,依次进行编译(无警告无错误),运行(段错误),并结合产生的core文件调试:
  • ~ $ gcc -o test test.c -g
  • ~ $ ./test
  • Segmentation fault (core dumped)
  • ~ $ file core
  • core: ELF 32-bit LSB core file Intel 80386, version 1 (SYSV), SVR4-style, from './test'
  • ~ $ gdb test core
  • GNU gdb (Gentoo 7.3.1 p1) 7.3.1
  • Copyright (C) 2011 Free Software Foundation, Inc.
  • ...
  • Core was generated by `./test'.
  • Program terminated with signal 11, Segmentation fault.
  • 0  0x08048574 in core_test () at test.c:7
  • 7                printf("%c\n",*str);
  • (gdb) where
  • 0  0x08048574 in core_test () at test.c:7
  • 1  0x0804859d in main (argc=1, argv=0xbfed0214) at test.c:12
  • (gdb) quit

很明显,问题是出在这里:
  • 0  0x08048574 in core_test () at test.c:7
  • 7                printf("%c\n",*str);

字符指针str未经初始化就试图(解除引用)访问它所指向的内存空间,导致出现无效的内存访问。其中where命令用来查看当前调用栈信息。

网站声明:如果转载,请联系本站管理员。否则一切后果自行承担。

本文链接:https://www.xckfsq.com/news/show.html?id=18857
赞同 0
评论 0 条
坚强踢牛排L0
粉丝 0 发表 5 + 关注 私信
上周热门
如何使用 StarRocks 管理和优化数据湖中的数据?  2959
【软件正版化】软件正版化工作要点  2878
统信UOS试玩黑神话:悟空  2843
信刻光盘安全隔离与信息交换系统  2737
镜舟科技与中启乘数科技达成战略合作,共筑数据服务新生态  1270
grub引导程序无法找到指定设备和分区  1235
华为全联接大会2024丨软通动力分论坛精彩议程抢先看!  165
点击报名 | 京东2025校招进校行程预告  164
2024海洋能源产业融合发展论坛暨博览会同期活动-海洋能源与数字化智能化论坛成功举办  163
华为纯血鸿蒙正式版9月底见!但Mate 70的内情还得接着挖...  159
本周热议
我的信创开放社区兼职赚钱历程 40
今天你签到了吗? 27
信创开放社区邀请他人注册的具体步骤如下 15
如何玩转信创开放社区—从小白进阶到专家 15
方德桌面操作系统 14
我有15积分有什么用? 13
用抖音玩法闯信创开放社区——用平台宣传企业产品服务 13
如何让你先人一步获得悬赏问题信息?(创作者必看) 12
2024中国信创产业发展大会暨中国信息科技创新与应用博览会 9
中央国家机关政府采购中心:应当将CPU、操作系统符合安全可靠测评要求纳入采购需求 8

加入交流群

请使用微信扫一扫!