segfault信息分析:segfault at a ip 00007f4220309664 sp 00007fff580042b0 error 4 in librt-2.17.so[7f422030

18 篇文章 1 订阅
11 篇文章 1 订阅

在编写linux程序时,程序崩溃,用dmesg查看到如下信息:

[7470411.358752] nmsrvd[10715]: segfault at a ip 00007f4220309664 sp 00007fff580042b0 error 4 in librt-2.17.so[7f4220305000+7000]

信息分析


at a :程序崩溃的内存指针变量的值,该示例的变量值为a(十进制 10),显然不是一个合法的内存地址。
ip 00007f4220309664 :指令所在的地址
sp 00007fff580042b0:当前的栈寄存器的值
error 4 :错误类型,当前示例的值为 4,表示访问违规,说明at 指向的值不是一个合法的内存地址
librt-2.17.so :崩溃所在的模块名,当前示例为动态库 /usr/lib64/librt-2.17.so
[7f4220305000+7000] 7f4220305000是librt-2.17.so在加载到内存中的起始地址(基地址),同一个程序在不同时刻启动加载的librt-2.17.so的基地址可能是不同的。

error 错误类型 的定义如下:

 * Page fault error code bits:
 *
 *   bit 0 == 0: no page found, 1: protection fault
 *   bit 1 == 0: read access, 1: write access
 *   bit 2 == 0: kernel-mode access, 1: user-mode access
 *   bit 3 == 1: use of reserved bit detected
 *   bit 4 == 1: fault was an instruction fetch

当前示例的error值为 4 为二进制 100,表示:user-mode access read access, no page found, 即用户模式读访问一个不存在的内存地址,根据这个推断,肯定是访问了一个不合法的内存地址。

那么通过该信息,怎样定位到崩溃位置的函数或行号呢?

用 ip 的值 00007f4220309664 减去 基地址 7f4220305000,可以获得错误在librt-2.17.so 中的偏移指令的地址,该示例:

00007f42203096647f42203050004664 (十六进制)

linux有一个工具 addr2line命令,可以帮助定位,通过如下命令行定位:

whereis librt-2.17.so

librt-2.17: /usr/lib/librt-2.17.so /usr/lib64/librt-2.17.so

addr2line -f -C -e /usr/lib64/librt-2.17.so 4664

 shm_unlink
??:?  

可以看到,是在调用  librt-2.17.so 库函数 shm_unlink 时发生了错误,笔者查看程序源代码,果然发现有一处调用了 shm_unlink 函数,没有进行相关指针检查而导致了segfault。

  • 7
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
引用中的链接提到的错误信息"segfault at 0 ip (null) sp 00007f329e870418 error 14 in main[400000 23c000]"是指发生了一个段错误(segmentation fault)。段错误通常是由于程序访问了不存在的内存地址或者非法的内存访问引起的。具体来说,"segfault at 0"表示在地址0处发生了段错误。这个错误信息中提到的ipsp分别表示指令指针和栈指针的值。而"error 14"则是表示发生了一个无效的页错误。根据这个错误信息,我们可以推断出在程序的main函数中发生了段错误。不过,需要注意的是,这个错误信息中的指令指针(ip)为(null),这可能意味着没有正确的调试符号(debug symbol)来解析函数名。所以,我们需要进一步分析系统日志或者其他相关信息来确定具体的原因和解决方法。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Python出现segfault错误解决方法](https://download.csdn.net/download/weixin_38616330/12875269)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [没有core文件时定位segfault at 0 ip (null) 的问题(三):艰难定位,多种原因](https://blog.csdn.net/lianshaohua/article/details/107933181)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [Coredump-N, segfault at 0 ip 0000000000000000 sp; 被kernel 抓到](https://blog.csdn.net/qq_36428903/article/details/122855636)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值