客户报告由于除零导致我们的一个程序出错。
我们只有这条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中使用disassemblegdb命令查看出现错误的行。

$ 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

汇编器转储结束。

09-04 19:35