сборка — c ++ отладка segfault на linux / amd64 (ассемблер)

Я пытаюсь отладить сбой моего приложения, используя дамп ядра,
Часть обратной трассировки выглядит так:

#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, какие-нибудь пункты?

3

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]