Я пытаюсь отладить сбой моего приложения, используя дамп ядра,
Часть обратной трассировки выглядит так:
#0 0x00000000000000a1 in ?? ()
#1 0x000000000065e8bf in TPageGroupBase::activate() ()
так как я понимаю, есть какой-то «дикий» прыжок к
такой адрес 0xa1
, похоже this
имеют неправильное значение.
Я смотрю на разборку TPageGroupBase::activate
, и получить:
Dump of assembler code for function _ZN14TPageGroupBase8activateEv:
0x000000000065e890 <+0>: push %r12
0x000000000065e892 <+2>: push %rbp
0x000000000065e893 <+3>: push %rbx
0x000000000065e894 <+4>: mov %rdi,%rbx
0x000000000065e897 <+7>: mov 0xdb7e9a(%rip),%rdi # 0x1416738 <_ZN11IPageWalker9instance_E>
0x000000000065e89e <+14>: mov (%rdi),%rax
0x000000000065e8a1 <+17>: callq *0x40(%rax)
0x000000000065e8a4 <+20>: mov 0x48(%rbx),%rbp
0x000000000065e8a8 <+24>: xor %esi,%esi
0x000000000065e8aa <+26>: mov %rax,%r12
0x000000000065e8ad <+29>: cmp $0x1,%r12
0x000000000065e8b1 <+33>: seta %sil
0x000000000065e8b5 <+37>: mov 0x50(%rbp),%rdi
0x000000000065e8b9 <+41>: mov (%rdi),%rax
0x000000000065e8bc <+44>: callq *0x68(%rax)
=> 0x000000000065e8bf <+47>: cmp $0x1,%r12
0x000000000065e8c3 <+51>: jbe 0x65e978 <_ZN14TPageGroupBase8activateEv+232>
Обновить: По словам Джестера (спасибо), я должен рассматривать предыдущую инструкцию как причину дикого прыжка.
Поэтому перестройте с включенными символами отладки, перезапустите тесты и снова получите сбой:
769 back_btn_->setVisible(val);
0x000000000091c14d <+29>: mov 0x50(%rdi),%rdi
0x000000000091c151 <+33>: mov (%rdi),%rax
0x000000000091c154 <+36>: movzbl %sil,%esi
0x000000000091c158 <+40>: callq *0x68(%rax)
back_btn_ — QSvgWidget (http://doc.qt.io/qt-4.8/qsvgwidget.html) а также QSvgWidget::setVisible
виртуальный,
как понимаю gas
Руководство по последней инструкции у нас есть это:
p/x *(unsigned *)($rax+0x68)
$7 = 0x141
в качестве адреса для прыжка, и это вызывает сбой.
И я понимаю (спасибо за комментарии), мы здесь загружаем адрес виртуальной функции, и
p/x *(unsigned *)($rdi+0x58)
$8 = 0x0
похоже, виртуальный адрес объекта равен нулю,
Я думал, что я не инициирую back_btn_
как-то,
но:
(gdb) p back_btn_
$9 = (QSvgWidget *) 0x36fe3f0
и этот адрес похож на другие адреса для действительного
объекты, поэтому кто-то повреждает его содержимое, а его нули
виртуальный стол, я прав?
Могу ли я извлечь что-то еще из этого coredump, какие-нибудь пункты?
Задача ещё не решена.
Других решений пока нет …