【发布时间】:2012-06-09 01:17:02
【问题描述】:
我正在编写一个可以递归打印目录的程序, 下面是gdb调试段
注意 d_path(它是一个 const char * 作为参数传递给 print_dir_tree) 在步骤到“if (dr == NULL) {”之前是“/home/cifer/.gftp” 但是,它在此子句之后打印为“/home/cifer/!\200”
谁能告诉我为什么? 非常感谢!
Breakpoint 1, print_dir_tree (d_path=0x805b058 "/home/cifer/.gftp", depth=4)
at dir_demo.c:15
15 DIR *dr = opendir(d_path);
(gdb) print d_path
$2 = 0x805b058 "/home/cifer/.gftp"
(gdb) print d_path
$3 = 0x805b058 "/home/cifer/.gftp"
(gdb) step
16 if (dr == NULL) {
(gdb) print d_path
$4 = 0x805b058 "/home/cifer/!\200"
(gdb) step
20 struct dirent *de = NULL;
(gdb) print d_path
$5 = 0x805b058 "/home/cifer/!\200"
(gdb) step
21 while((de = readdir(dr)) != NULL) {
(gdb) print d_path
$6 = 0x805b058 "/home/cifer/!\200"
(gdb)
【问题讨论】:
-
不看代码很难说;可能依赖于未定义的行为,可能是某处的缓冲区溢出。你应该创建一个minimal test-case。
-
是否还有其他线程 - 它们在调试期间被禁用了吗?忙调试时清理dr的内存有没有超时?你能用一个非常简单的程序来复制吗?
-
现在我粘贴整个代码......