Что означает сообщение обратной трассировки GDB «0x0000000000000000 в ??»()" иметь в виду?

StackOverflow https://stackoverflow.com/questions/121326

Вопрос

Что это значит, когда он дает обратную трассировку со следующим выводом?

#0  0x00000008009c991c in pthread_testcancel () from /lib/libpthread.so.2
#1  0x00000008009b8120 in sigaction () from /lib/libpthread.so.2
#2  0x00000008009c211a in pthread_mutexattr_init () from /lib/libpthread.so.2
#3  0x0000000000000000 in ?? ()

Программа вылетела со стандартным сигналом 11, ошибка сегментации.Мое приложение представляет собой многопоточную программу FastCGI C++, работающую на FreeBSD 6.3 и использующую pthread в качестве библиотеки потоков.

Согласно источникам информации, он был скомпилирован с ключом -g, и все таблицы символов для моего источника загружены.

Как ясно, ни один из моих реальных кодов не появляется в трассировке, но вместо этого ошибка, похоже, исходит из стандартных библиотек pthread.В частности, что такое??() ????

РЕДАКТИРОВАТЬ:в конечном итоге отследил сбой до стандартного недопустимого доступа к памяти в моем основном коде.Не объясняет, почему трассировка стека была повреждена, но это вопрос для другого дня :)

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

Решение

gdb не смог извлечь правильный адрес возврата из pthread_mutexattr_init;он получил адрес 0."??" является результатом поиска адреса 0 в таблице символов.Он не может найти символическое имя, поэтому печатает значение по умолчанию "??"

К сожалению, я не знаю, почему он не смог извлечь правильный обратный адрес.

Другие советы

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

Обязательно компилируйте с символами отладки.(Я думаю, что для gcc это опция -g).Тогда вы сможете получить более интересную информацию из GDB.Не забудьте отключить его при компиляции рабочей версии.

Я мог что-то упустить, но не указывает ли это на то, что кто-то использует NULL как указатель на функцию?

#include <stdio.h>

typedef int (*funcptr)(void);

int
func_caller(funcptr f)
{
    return (*f)();
}

int
main()
{
    return func_caller(NULL);
}

Это создает тот же стиль обратной трассировки, если вы запускаете ее в GDB:

rivendell$ gcc -g -O0 foo.c -o foo
rivendell$ gdb --quiet foo
Reading symbols for shared libraries .. done
(gdb) r
Starting program: ...
Reading symbols for shared libraries . done

Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: KERN_PROTECTION_FAILURE at address: 0x00000000
0x00000000 in ?? ()
(gdb) bt
#0    0x00000000 in ?? ()
#1    0x00001f9d in func_caller (f=0) at foo.c:8
#2    0x00001fb1 in main () at foo.c:14

Хотя это довольно странная авария... pthread_mutexattr_init редко делает что-то большее, чем выделяет структуру данных и memset это.Я бы поискал что-нибудь еще.Есть ли вероятность несовпадения библиотек потоков или что-то в этом роде.Мои знания BSD немного устарели, но раньше с этим были проблемы.

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

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