Причуды GDB с процессом резьбы - PullRequest
0 голосов
/ 19 октября 2010

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

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

Перед переключением конкретный поток выполняет sleep(5);

Почему GDB не может определить точку, из которойкод "Сегфоулт"?

1 Ответ

3 голосов
/ 19 октября 2010

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

EDIT Обратите внимание, что на x86 вы в конечном итоге будете вести себя так же, как описано в коде вроде

_start:
   mov eax,0x11
   jmp eax

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

...