[英]Segfaulting on function call (C)
因此,我現在有些茫然,希望有人能提供幫助。 我在一個名為“ 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輸出似乎並未表明其他情況。
因此,我想知道是否有人對如何確定該函數的定義有任何建議。 另外,由於我似乎沒有其他選擇,因此我現在已如上所述重命名了函數……但是我不確定這是否是一個好主意? 即,我可以這樣掩蓋其他問題嗎?
提前致謝。
如果您使用的是linux,則valgrind
是查找內存管理問題的寶貴工具。
嘗試從鏈接器生成鏈接映射。
在我的系統上,要在stdout上生成地圖(很多行)
gcc ... -Wl,-M ... ### ^ lowercase L
或者,使用地圖創建文件
gcc ... -Wl,-Map,a.map ...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.