客户报告由于除零导致我们的一个程序出错。
我们只有这条VLM行:
kernel: myprog[16122] trap divide error rip:79dd99 rsp:2b6d2ea40450 error:0
我认为没有核心文件。
我在Internet上进行了搜索,以找到如何将导致该除数为零的程序行告诉我,但是到目前为止,我还是失败了。
我知道16122是该程序的pid,因此对我没有帮助。
我怀疑rsp:2b6d2ea40450与导致错误的行地址有关(0x2b6d2ea40450),但这是真的吗?
如果是这样的话,假设我可以将myprog的调试版本加载到gdb中,然后请求显示该地址周围的上下文,那么我该如何将其转换为源中的物理近似位置...
任何,任何帮助将不胜感激!
最佳答案
rip是指令指针,rsp是堆栈指针。除非您具有核心镜像或正在运行的进程,否则堆栈指针不会太有用。
您可以根据ip在addr2line
中使用disassemble
或gdb
命令查看出现错误的行。
$ cat divtest.c
主要()
{
整数a,b;
a = 1; b = a/0;
}
$ ./divtest
浮点异常(核心已转储)
$ dmesg | tail -1
[6827.463256]陷阱:divtest [3255]陷阱划分错误ip: 400504 sp:7fff54e81330
divtest中的错误:0 [400000 + 1000]
$ addr2line -e divtest 400504
./divtest.c:5
$ gdb divtest
(gdb)disass/m 0x400504
函数main的汇编代码转储:
2 {
0x00000000004004f0:推送%rbp
0x00000000004004f1:mov%rsp,%rbp
3 int a,b;
4
5 a = 1; b = a/0;
0x00000000004004f4:移动$ 0x1,-0x4(%rbp)
0x00000000004004fb:mov -0x4(%rbp),%eax
0x00000000004004fe:移动$ 0x0,%ecx
0x0000000000400503:CLTD
0x0000000000400504:idiv%ecx
0x0000000000400506:mov%eax,-0x8(%rbp)
6}
0x0000000000400509: pop %rbp
0x000000000040050a:retq
汇编器转储结束。