Какие адреса в основных файлах? - PullRequest
3 голосов
/ 08 января 2012

Это часть моего основного файла:

[New Thread 30385]
[New Thread 30383]
[New Thread 30381]
[New Thread 30379]
[New Thread 30378]
[New Thread 30270]
[New Thread 30268]
Core was generated by `test'.
Program terminated with signal 11, Segmentation fault.
#0  0x001cd1a6 in ?? ()

Означает ли это, что моя программа падает на 0x001cd1a6 или программа падает при попытке чтения / записи по этому адресу?
По этому адресу нет исполняемого кода.
Другое дело, что каждый раз при сбое он выдает другой адрес.

1 Ответ

3 голосов
/ 08 января 2012

Означает ли это, что моя программа падает в 0x001cd1a6

Да.

По этому адресу нет исполняемого кода.

Ну, это наверняка вызовет сбой (из-за недопустимых инструкций).

Другое дело, что каждый раз при сбое он выдает другой адрес.

В вашей программе есть потоки, поэтому схема ее распределения, вероятно, меняется при каждом запуске, поскольку потоки планируются по-разному.

Кроме того, Linux использует рандомизацию адресов, поэтому, если вы запускаете даже непотоковую программу несколько раз, вы получите разные адреса. С другой стороны, GDB отключает эту рандомизацию, поэтому, если вы запускаете непотоковую программу под GDB, она каждый раз должна вылетать в одном и том же месте.

Вы, вероятно, вызываете виртуальную функцию для объекта, который был признан недействительным (например, удален). Используйте команду where GDB, чтобы узнать как вы оказались на неверном адресе.

Кроме того, никогда не вызывайте свой исполняемый файл test в UNIX: это конфликтует с /usr/bin/test, который будут использовать многие сценарии оболочки.

...