【发布时间】:2017-09-01 06:41:33
【问题描述】:
在我同事的 PC 中使用相同的命令,我的程序可以正常运行。 但在我的电脑中,程序因段错误而崩溃;
核心的GDB回溯如下:
#0 strrchr () at ../sysdeps/x86_64/strrchr.S:32
32 ../sysdeps/x86_64/strrchr.S: no such file or directory
(gdb) bt
#0 strrchr () at ../sysdeps/x86_64/strrchr.S:32
#1 0x00007f10961236d7 in dirname (path=0x324a47a0 <error: Cannot access memory at address 0x324a47a0>) at dirname.c:31
我已经在使用 -g -ggdb 选项编译可执行文件。
奇怪的是.. 使用 valgrind 程序在我的 PC 上也能正常工作。
我该如何解决这个问题?我观察到这些错误只发生在 strrchr、strcmp、strlen、... string.h 函数中。
+Edit:gdb回溯表明程序在此处崩溃:
char* base_dir = dirname(get_abs_name(test_dir));
get_abs_name 定义为
char* get_abs_name(char* dir) {
char abs_path[PATH_MAX];
char* c = malloc(PATH_MAX*sizeof(char));
realpath(dir, abs_path);
strcpy(c, abs_path);
return c;
}
+Edit2: 'dir' 是某个文件的路径,比如'../program/blabla.jpg'。
使用 valgrind,
printf("%s\n", dir)
通常打印“/home/frozenca/path_to_program”。 我猜不出为什么没有 valgrind 程序会崩溃..
【问题讨论】:
-
您的程序中有错误。很可能是一些缓冲区溢出。发布代码以获得有用的答案。
-
所以您希望我们在不查看代码的情况下修复您的代码。好。 .
-
请研究minimal reproducible example 的概念并阅读How to Ask。
-
错误出现在strchr/strcmp/strlen/etc。不是因为这些函数有错误,而是因为您自己的代码以您不应该的方式(直接或间接)调用这些函数。您需要检查 realpath() 是否成功 - 因为您没有在这里检查错误,也许还有其他重要的地方您忘记检查并捕获真正的错误。您还需要检查函数的
dir参数,以验证它是否包含您认为它应该包含的内容(并向我们展示它包含的内容)。 -
@spectras 我正要编辑我的评论以包含该信息:) 所以基本上该函数是
realpath的包装,并且无用(而且有问题)。
标签: c