【发布时间】:2011-03-02 17:19:18
【问题描述】:
我有一个多线程 (pthreads) 程序,其中 main() 调用函数 omp_file_open_all() 并将字符串作为 char* 与其他参数一起传递。我正在使用 gdb 调试一些东西,发现 gdb 没有正确打印出字符串值,而函数内部的 printf 可以正确打印出它。
Breakpoint 1, omp_file_open_all (fd=0x423bb950, filename=0x7f605df078e0 "", mode=-16843009) at pthread_coll_file_open.c:29
29 if(omp_get_thread_num() == MASTER)
(gdb) print filename
$1 = 0x7f605df078e0 ""
所以 gdb 将 filename 显示为空,而函数内的 printf 将正确的值输出为“/tmp/test.out”。被调用的函数 (omp_file_open_all) 定义如下(与 main() 不在同一个文件中):
int omp_file_open_all (int fd, char* filename, int mode);
我不能在这里发布我的程序,因为这是一个更大的代码的一部分。 1500 行代码。 'filename' 是一个全局变量,在新线程产生之前由主线程在 main() 中设置。
所以这不是错误,我只是偶然发现它,但我有兴趣找出 gdb 不显示正确值的原因。
操作系统:64 位 OpenSUSE, gdb 6.8
感谢您的帮助。
【问题讨论】:
-
没有人希望你发布你的整个 1.5KLOC 程序;做一个测试用例!
-
0x7f605df078e0是一个非常可疑的指针值。没有任何代码,我们无法说出原因。 -
当您使用
printf和使用gdb 进行测试时,您的编译是否有所不同?也许编译器正在优化文件名... -
@pmg,我不使用 printf 和 gdb 单独测试。 printf 始终存在。
-
@Tomalak,我尝试剥离 1.5KLOC 代码,但无法重现上述情况。我编写了类似的单独测试用例,但没有看到上述行为。 gdb 正确显示文件名。并且原谅我之前没有说这个,但是上面的代码是pthreads代码。