所以,我现在有些不知所措,希望有人可以提供帮助。我有一个名为'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输出似乎没有提示。
所以我想知道是否有人有关于如何寻找可以定义此功能的地方的任何提示。另外,我现在已经重命名了上面提到的功能,因为我似乎没有任何其他选择...但我不确定这是否是一个好/安全的想法?也就是说,我可以通过这样做来掩盖其他问题吗?
提前致谢。
答案 0 :(得分:7)
如果您使用的是Linux,valgrind
是查找内存管理问题的宝贵工具。
答案 1 :(得分:2)
尝试从链接器生成链接映射。
在我的系统上,在stdout上生成一个地图(很多很多行)
gcc ... -Wl,-M ... ### ^ lowercase L
或者,使用地图
创建文件gcc ... -Wl,-Map,a.map ...