Linux 如何翻译内核';s陷阱分割错误rsp:2b6d2ea40450到源位置?
客户报告我们的一个程序因除法为零而出错。 我们只有这条VLM生产线:Linux 如何翻译内核';s陷阱分割错误rsp:2b6d2ea40450到源位置?,linux,debugging,gdb,divide-by-zero,Linux,Debugging,Gdb,Divide By Zero,客户报告我们的一个程序因除法为零而出错。 我们只有这条VLM生产线: kernel: myprog[16122] trap divide error rip:79dd99 rsp:2b6d2ea40450 error:0 我不相信有这方面的核心文件 我在互联网上搜索了一下,想知道我是如何分辨导致这个除法为零的程序行的,但到目前为止,我还是失败了 我知道16122是程序的pid,所以这对我没有帮助 我怀疑rsp:2b6d2ea40450与导致错误的线路地址(0x2b6d2ea40450)有关,
kernel: myprog[16122] trap divide error rip:79dd99 rsp:2b6d2ea40450 error:0
我不相信有这方面的核心文件
我在互联网上搜索了一下,想知道我是如何分辨导致这个除法为零的程序行的,但到目前为止,我还是失败了
我知道16122是程序的pid,所以这对我没有帮助
我怀疑rsp:2b6d2ea40450与导致错误的线路地址(0x2b6d2ea40450)有关,但这是真的吗
如果是,那么假设我可以将myprog的调试版本加载到gdb中,然后请求显示此地址周围的上下文,我如何将其转换为源代码中的物理近似位置
任何,任何帮助都将不胜感激 rip是指令指针,rsp是堆栈指针。除非有核心映像或正在运行的进程,否则堆栈指针不会太有用 您可以使用
addr2line
或gdb
中的反汇编
命令,根据ip查看出错的行
$ cat divtest.c
main()
{
int a, b;
a = 1; b = a/0;
}
$ ./divtest
Floating point exception (core dumped)
$ dmesg|tail -1
[ 6827.463256] traps: divtest[3255] trap divide error ip:400504 sp:7fff54e81330
error:0 in divtest[400000+1000]
$ addr2line -e divtest 400504
./divtest.c:5
$ gdb divtest
(gdb) disass /m 0x400504
Dump of assembler code for function main:
2 {
0x00000000004004f0 : push %rbp
0x00000000004004f1 : mov %rsp,%rbp
3 int a, b;
4
5 a = 1; b = a/0;
0x00000000004004f4 : movl $0x1,-0x4(%rbp)
0x00000000004004fb : mov -0x4(%rbp),%eax
0x00000000004004fe : mov $0x0,%ecx
0x0000000000400503 : cltd
0x0000000000400504 : idiv %ecx
0x0000000000400506 : mov %eax,-0x8(%rbp)
6 }
0x0000000000400509 : pop %rbp
0x000000000040050a : retq
End of assembler dump.
$cat divtest.c
main()
{
INTA,b;
a=1;b=a/0;
}
美元/分测试
浮点异常(内核转储)
$dmesg | tail-1
[6827.463256]陷阱:除法测试[3255]陷阱除法错误ip:400504sp:7fff54e81330
错误:divtest[400000+1000]中的0
$addr2line-e divtest 400504
c:5
$gdb divtest
(gdb)disass/m 0x400504
主功能的汇编程序代码转储:
2 {
0x00000000004004f0:推送%rbp
0x0000000000404F1:mov%rsp,%rbp
3 int a,b;
4.
5A=1;b=a/0;
0x0000000000404F4:movl$0x1,-0x4(%rbp)
0x00000000004004fb:mov-0x4(%rbp),%eax
0x00000000004004fe:mov$0x0,%ecx
0x0000000000400503:cltd
0x0000000000400504:idiv%ecx
0x0000000000400506:mov%eax,-0x8(%rbp)
6 }
0x0000000000400509:弹出%rbp
0x000000000040050a:retq
汇编程序转储结束。
做记号非常感谢你!