目录
背景:程序出现段错误,没有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+0x237> 13100: 48 8b 0d d1 8e 20 00 mov 0x208ed1(%rip),%rcx # 21bfd8 <m_pCMData@@Base-0x428> 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+0xef> 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 <m_pCMData@@Base-0x428> 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+0xef> 13180: 48 8b 0d 51 8e 20 00 mov 0x208e51(%rip),%rcx # 21bfd8 <m_pCMData@@Base-0x428> 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@plt> 131c2: 83 f8 01 cmp $0x1,%eax 131c5: 75 07 jne 131ce <_Z30csta_scm_baseServiceEventSetupP13STRUCT_CM_MSGiii+0xef> 131c7: b8 01 00 00 00 mov $0x1,%eax 131cc: eb 05 jmp 131d3 <_Z30csta_scm_baseServiceEventSetupP13STRUCT_CM_MSGiii+0xf4> 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+0x233> 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 找出断点所在的文件及位置。