2010-06-22 172 views
1

编程接收到的信号SIGSEGV,分段错误。 0x08049795 in execute_jobs() 当前语言:auto;目前在汇编在gdb中这意味着什么?

(GDB)信息符号0x08049795 execute_jobs + 22 .text段

(GDB)p型0x08049795 类型= INT

如何获得在发生错误的行号?

+4

首先,您需要使用-ggdb3进行编译,然后GDB会为您提供该信息。 – 2010-06-22 18:22:09

+0

使用调试符号进行编译,不进行优化,然后通过valgrind运行。您将立即通过观看烟花来查看段落原因,请参阅http://valgrind.org – 2010-06-22 20:28:20

回答

2

gdb命令“bt”会向您显示回溯。除非你损坏了堆栈,否则应该显示导致段错误的函数调用序列。为了获得更有意义的信息,请确保您已通过在gcc/g ++命令行中包含-g来编译带有调试信息的程序。

+0

谢谢。我知道这一点。 – blacktooth 2010-06-22 18:34:40

+0

编程接收到的信号SIGSEGV,分段故障。 (job_comparator_randomjobid(element1 = 0x804d0c0,element2 = 0x804d60c)at ./machinejob.c:860 JOB job1 = *((JOB *)element1); (gdb)info symbol 0x0804ae2a job_comparator_randomjobid + 20 in section .text 20以上是什么? – blacktooth 2010-06-22 18:37:20

7

您的二进制文件没有用调试信息编译。与至少-g重建(或-ggdb,或-ggdb -g3,见GCC manual。)

从GDB输出的确切行:

(gdb) info symbol 0x08049795 execute_jobs + 22 in section .text 

指在地址0x08049795,这是从功能execute_jobs开始22个字节,其指令,产生了分段故障。

(gdb) ptype 0x08049795 type = int 

在这里,你要求的是一个整型的类型,并且GDB愉快地回复。不要

(gdb) x/10i 0x08049795 

(gdb) disassemble execute_jobs 

看到实际指令。

+0

程序收到信号SIGSEGV,分段故障。 0x0804ae71在./machinejob.c:860 JOB JOB1 = *((JOB *)元素1)job_comparator_randomjobid(元素1 = 0x804d0c0,在element2 = 0x804d354); 如何确定导致分段故障的确切错误? – blacktooth 2010-06-22 19:49:52

+0

@blacktooth,你必须在860行围绕'machinejob.c'显示代码,以便我们能够帮助你。 'JOB'是什么?一个指针? 'element1'的类型是什么?根本原因是某个地方的无效地址。 – 2010-06-22 19:56:40