Вопрос

Я отладку процесса с несколькими потоками в GDB. Я скомпилировал файл источника подошва с -g флаг. Однако при работе в GDB возникает следующий сценарий:

Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0xb7fe2b70 (LWP 2604)]
0x00000011 in ?? ()

До переключателя конкретная поток выполняет sleep(5);

Почему GDB не может определить точку, из которой код «SegFaulted»?

Это было полезно?

Решение

0x00000011 не является действительным адресом, особенно не для кода. Это говорит нам, что нет кода (таким образом, нет функции) на 0x00000011. И это говорит нам, что ваш стек поврежден. Без «рабочего» стека, GDB не может выяснить, как вы получите вашу тему, где есть, потому что он не регистрирует никаких вызовов по умолчанию, и, следовательно, опирается исключительно на стек.

РЕДАКТИРОВАТЬОбратите внимание, что на x86 вы получите аналогичное поведение, как вы описали подобным кодом

_start:
   mov eax,0x11
   jmp eax

Это приводит к прыжкому / ветсу в регион (0x11), где нет кода и, следовательно, ни один не отладки символов. Это может произойти в том случае, как в моем примере, но и, если стек переопределен (поврежден), и возвратный скачок приводит к неверному адресу (например, 0x11)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top