linux 查找段错误,linux 定位段错误的一个方法

背景:程序出现段错误,没有core文件产生,日志没来得及写堆栈信息。

步骤1:使用dmesg查看系统运行信息。

cstaspee[10259]: segfault at 4 ip 00007fdb92acd1df sp 00007fd9c5e65d20 error 6 in libcsta_scm.so[7fdb92aba000+1c000]

发现在cstaspee在调用libcsta_scm.so动态库出现段错误。

步骤2:计算错误点在动态库的地址

7fdb92aba000为模块(libcsta_scm.so)载入地址,

00007fdb92acd1df为程序崩溃点ip指令地址,

相减 00007fdb92acd1df - 7fdb92aba000 = 131DF,

差值为错误点在动态库的地址。

步骤3:使用objdump命令反汇编 或 addr2line

objdump -d libcsta_scm.so > /tmp/xxx.txt

xxx.txt部分文件内容

00000000000130df <_z30csta_scm_baseserviceeventsetupp13struct_cm_msgiii>:

130df: 55 push %rbp

130e0: 48 89 e5 mov %rsp,%rbp

130e3: 48 83 ec 30 sub $0x30,%rsp

130e7: 48 89 7d e8 mov %rdi,-0x18(%rbp)

130eb: 89 75 e4 mov %esi,-0x1c(%rbp)

130ee: 89 55 e0 mov %edx,-0x20(%rbp)

130f1: 89 4d dc mov %ecx,-0x24(%rbp)

130f4: c7 45 fc 00 00 00 00 movl $0x0,-0x4(%rbp)

130fb: e9 16 02 00 00 jmpq 13316 <_z30csta_scm_baseserviceeventsetupp13struct_cm_msgiii>

13100: 48 8b 0d d1 8e 20 00 mov 0x208ed1(%rip),%rcx # 21bfd8

13107: 8b 45 fc mov -0x4(%rbp),%eax

1310a: 48 63 d0 movslq %eax,%rdx

1310d: 8b 45 e4 mov -0x1c(%rbp),%eax

13110: 48 63 f0 movslq %eax,%rsi

13113: 48 89 d0 mov %rdx,%rax

13116: 48 c1 e0 03 shl $0x3,%rax

1311a: 48 01 d0 add %rdx,%rax

1311d: 48 c1 e0 06 shl $0x6,%rax

13121: 48 69 d6 d8 39 28 00 imul $0x2839d8,%rsi,%rdx

13128: 48 01 d0 add %rdx,%rax

1312b: 48 01 c8 add %rcx,%rax

1312e: 48 05 c0 09 04 00 add $0x409c0,%rax

13134: 8b 40 04 mov 0x4(%rax),%eax

13137: 83 f8 01 cmp $0x1,%eax

1313a: 0f 85 8e 00 00 00 jne 131ce <_z30csta_scm_baseserviceeventsetupp13struct_cm_msgiii>

13140: 8b 45 fc mov -0x4(%rbp),%eax

13143: 48 63 d0 movslq %eax,%rdx

13146: 48 89 d0 mov %rdx,%rax

13149: 48 c1 e0 03 shl $0x3,%rax

1314d: 48 01 d0 add %rdx,%rax

13150: 48 c1 e0 06 shl $0x6,%rax

13154: 8b 55 e4 mov -0x1c(%rbp),%edx

13157: 48 63 d2 movslq %edx,%rdx

1315a: 48 69 d2 d8 39 28 00 imul $0x2839d8,%rdx,%rdx

13161: 48 01 d0 add %rdx,%rax

13164: 48 8d 90 c0 09 04 00 lea 0x409c0(%rax),%rdx

1316b: 48 8b 05 66 8e 20 00 mov 0x208e66(%rip),%rax # 21bfd8

13172: 48 01 d0 add %rdx,%rax

13175: 48 83 c0 0c add $0xc,%rax

13179: 0f b6 00 movzbl (%rax),%eax

1317c: 84 c0 test %al,%al

1317e: 74 4e je 131ce <_z30csta_scm_baseserviceeventsetupp13struct_cm_msgiii>

13180: 48 8b 0d 51 8e 20 00 mov 0x208e51(%rip),%rcx # 21bfd8

13187: 8b 45 fc mov -0x4(%rbp),%eax

1318a: 48 63 d0 movslq %eax,%rdx

1318d: 8b 45 e4 mov -0x1c(%rbp),%eax

13190: 48 63 f0 movslq %eax,%rsi

13193: 48 89 d0 mov %rdx,%rax

13196: 48 c1 e0 03 shl $0x3,%rax

1319a: 48 01 d0 add %rdx,%rax

1319d: 48 c1 e0 06 shl $0x6,%rax

131a1: 48 69 d6 d8 39 28 00 imul $0x2839d8,%rsi,%rdx

131a8: 48 01 d0 add %rdx,%rax

131ab: 48 01 c8 add %rcx,%rax

131ae: 48 05 00 0a 04 00 add $0x40a00,%rax

131b4: 0f b7 40 0c movzwl 0xc(%rax),%eax

131b8: 0f b7 c0 movzwl %ax,%eax

131bb: 89 c7 mov %eax,%edi

131bd: e8 8e 0d ff ff callq 3f50 <_z26csta_scm_utilisvaliddevicei>

131c2: 83 f8 01 cmp $0x1,%eax

131c5: 75 07 jne 131ce <_z30csta_scm_baseserviceeventsetupp13struct_cm_msgiii>

131c7: b8 01 00 00 00 mov $0x1,%eax

131cc: eb 05 jmp 131d3 <_z30csta_scm_baseserviceeventsetupp13struct_cm_msgiii>

131ce: b8 00 00 00 00 mov $0x0,%eax

131d3: 84 c0 test %al,%al

131d5: 0f 84 37 01 00 00 je 13312 <_z30csta_scm_baseserviceeventsetupp13struct_cm_msgiii>

131db: 48 8b 45 e8 mov -0x18(%rbp),%rax

131df: c7 40 04 01 00 00 00 movl $0x1,0x4(%rax)

131e6: 48 8b 45 e8 mov -0x18(%rbp),%rax

131ea: c7 80 08 01 00 00 00 movl $0x0,0x108(%rax)

在xxx.txt文件中查找步骤2的地址131DF,

可以知道问题出在csta_scm_baseServiceEventSetup

(echo _Z30csta_scm_baseServiceEventSetupP13STRUCT_CM_MSGiii |   c++filt     )

或者直接使用addr2line命令查看错误出在哪个文件哪一行。

addr2line -e libcsta_scm.so 131df

总结

dmesg 查看崩溃的信息,计算崩溃地址。

objdump或addr2line 找出断点所在的文件及位置。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值