2013-02-26 15 views
1

После получения ошибки seg я использовал команду ядра gdb a.out. Впоследствии я использовал backtrace (bt), и это то, что gdb говорит мнеПочему я получаю ошибку seg?

предупреждение: файл ядра может не соответствовать указанному исполняемому файлу.

предупреждения: Ошибка чтения разделяемой библиотеки записи списка на 0xfbe8

предупреждения: Ошибка чтение разделяемой библиотеки записи списка на 0x74c085ff

Ядра было сгенерировано «family.out smith.ged».

Программа завершена сигналом 11, ошибка сегментации.

(poundsign) 0 0x08086a6 в count_records()

(Gdb) Bt

(poundsign) 0 0x080486a6 в count_records()

(poundsign) 1 0x08048906 в __libc_csu_init()

(фунт стерлингов) 2 0xbf85624c in ??()

(moneyign) 3 0xbf856310 in ??()

Backtrace остановился: предыдущий Фрам внутреннего для этого кадра

Может кто-нибудь дать мне некоторое представление о том, что могло вызвать эту ошибку сегментной (коррумпированная стеку?) Обычно gdb дает мне номер строки в программе, но на этот раз это не так.

+2

Скорее всего, вы получили доступ к памяти, которой у вас не было. Помимо этого, вероятно, нужно увидеть код! –

+0

Выход gdb указывает, что вы смотрите на основной файл, сгенерированный другим двоичным кодом. Чтобы отладить ваше приложение, вы можете запустить его внутри gdb (используйте «gdb binary», затем команду «run») или используйте что-то вроде valgrind. – vanza

+0

Определенно используйте valgrind для segfaults. – matzahboy

ответ

3

Что может случиться, что вы повредили стек. Многие состояния программы (включая все фреймы стека, которые говорят вам, какая функция вы находитесь) находятся в стеке, поэтому после перезаписывания отладчик имеет поврежденную информацию для работы.

Общим способом сделать это является переполнение буфера, объявленного как локальная переменная, в виде строки, например.

int main() 
{ 
    char buf[4]; 
    return func1(buf); 
} 

int func1(char* theBuf) 
{ 
    return func2(theBuf); 
} 

int func2(char* sameBufBackSomeplaceInTheStack) 
{ 
    sprintf(sameBufBackSomeplaceInTheStack, "The stack is doomed."); 
    return 0; 
} 

Результаты могут отличаться, но мой разрушен стек выглядит в отладчике после того как я это сделать:

Program received signal EXC_BAD_ACCESS, Could not access memory. 
Reason: KERN_INVALID_ADDRESS at address: 0x0000000000000000 
0x0000000100000d00 in _mh_execute_header() 
(gdb) where 
#0 0x0000000100000d00 in _mh_execute_header() 
#1 0x0000000000000000 in ??() 
(gdb) 

Во всяком случае, где-то где-то ваша программа перезаписывается стек, который часто бросает вызов для отладки ...

Смежные вопросы