背景:程序出现段错误,没有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 找出断点所在的文件及位置。