gdb检测到分段错误。如何确定确切的来源?

时间:2010-12-04 22:02:34

标签: c++ gdb

(gdb) s
Things:action (this=0x7fffffffdce0, packet=0x62c980) at file:41
41              if( thing->work(data) ) {
(gdb) s
Program received signal SIGSEGV, Segmentation fault.
0x00000000004040e1 in Things:action (this=0x7fffffffdce0, packet=0x62c980) at file:41
41              if( thing->work(data) ) {

backtrace中,工作(数据)是最后一个;并且在GDB管理的进程输入work(data)之前发生了分段(似乎)。在list中,没有工作声明(数据),所以猜测执行了更多的代码,而不是回溯和最新步骤。

  1. 那个段错误是否来自坏指针作为函数参数以错误方式传递(没有“extern C”或其他一些准备工作)? (假设没有执行功能代码)
  2. 如何获得详细的跟踪来确定,进入函数后是否执行了任何work()代码,或者当进程尝试进入函数时发生错误,从而将其参数传递给libc?

2 个答案:

答案 0 :(得分:1)

正如我在评论中所说:我认为执行从未达到work(data)因为this指针无效(0x7fffffffdce0看起来像垃圾)。 SIGSEGV位于this->

对象是否在某些时候被销毁/删除,并且您是否保留了引用或指针?

答案 1 :(得分:1)

嗯,work()除非是内联的,否则无法启动,或者它本来就是回溯的顶端......

我会尝试拆解以查看触发SIGSEGV的指令并从那里开始。