Segfaulting при вызове функции (C) - PullRequest
1 голос
/ 26 июня 2011

Итак, я сейчас в некоторой растерянности и надеюсь, что кто-то может помочь. У меня есть функция, определенная в библиотеке с именем list_free, которая, как вы можете себе представить, освобождает список, который вы создали ранее. Когда я вызываю эту функцию из другого модуля, моя программа перестает работать. При запуске GDB я получаю:

(gdb) bt
#0  *__GI___libc_free (mem=0x65656853) at malloc.c:3709
#1  0x0804f279 in list_free ()
#2  0x0012ffef in set_var (...) at src/calc/model.c:337
#3  0x0804b320 in test_dependency_updates (_i=0) at src/tests/test_calc.c:63
#4  0x080507ea in srunner_run_all ()
#5  0x0804d2b9 in main () at src/tests/test_all.c:19

Таким образом, линия, которая привлекла мое внимание, была # 1 ... нет ссылки на источник этой функции. Когда я изменяю имя функции с list_free на list_freex (т.е. просто что-то другое), больше не возникает ошибка сегмента. Другая странная вещь - если я изменю имя в файле .c, я не получу предупреждения о «неопределенной ссылке на list_free» или о любой другой ошибке, которую я получу, если забуду добавить ссылку в библиотеку.

Таким образом, меня убеждают, что функция определяется в другом месте, но я понятия не имею, где. grep -R list_free . не предлагает никакой помощи, и вывод gdb, похоже, не указывает на иное.

Так что мне интересно, есть ли у кого-нибудь советы о том, как найти эту функцию. Кроме того, я переименовал функцию, как отмечалось выше, на данный момент, поскольку у меня нет другого выбора ... но я не уверен, что это хорошая / безопасная идея? То есть, я мог бы просто так замаскировать другие проблемы?

Заранее спасибо.

Ответы [ 2 ]

7 голосов
/ 26 июня 2011

Если вы используете Linux, valgrind - это бесценный инструмент для поиска проблем с управлением памятью.

2 голосов
/ 26 июня 2011

Попробуйте создать карту ссылок из компоновщика.

В моей системе, чтобы создать карту на стандартный вывод (много-много строк)

    gcc ... -Wl,-M ...
    ###       ^ lowercase L

Или создать файлс картой

    gcc ... -Wl,-Map,a.map ...
...