此时因为我们不知道错误是发生在哪一行,所以我们直接一点,运行“r”,
会出现:
Program received signal SIGSEGV, Segmentation fault.
0x00000000004009a1 in Timer::Timeout (this=0x7fffffffddd0) at ./main.cpp:28
根据上面我们可以看到Timer::Timeout 发生了Segmentation fault,在main.cpp的28行
这行的代码是:
void Timer::Timeout() {
handler_->OnTimer();
}
是handler_->OnTimer();崩溃了,因为handler_是指针,所以可能是指向的地址错误。我们p一下它的值:
(gdb) p handler_
$1 = (TimerHandler *) 0x0
居然是0,现在基本可以明白错误是什么了,是因为handler_没有赋值导致的
所以我们查一下代码看它是在哪里赋值,看了一下,在:
12│ void SetHandler(TimerHandler *handler) {
13│ handler_ = handler;
14│ }
看哪里调用它?居然没有人调用他,所以是这里的问题了
39 Timer timer;
40 SomeTimer sometimer;
41 timer.SetHandler(&timer);
42 timer.Timeout();
加上41行就没有问题了
我们的调试也就到此为止!!!