我有一个多线程(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
感谢您的帮助。
答案 0 :(得分:0)
您的代码中可能存在一些问题。使用以下代码段,我正确地获得了 gdb 打印的字符串。
#include <stdio.h>
#include <stdlib.h>
void checkString( char* fileName )
{
printf("%s", fileName);
}
int main()
{
char* name = "temp";
checkString(name);
return 0;
}
mahesh-babu-vattiguntas-macbook-pro:Desktop mahesh$ gdb gdb.out
GNU gdb 6.3.50-20050815 (Apple version gdb-1469) (Wed May 5 04:36:56 UTC 2010)
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "x86_64-apple-darwin"...Reading symbols for shared libraries .. done
(gdb) b gdb.c:6
Breakpoint 1 at 0x100000ebc: file gdb.c, line 6.
(gdb) run gdb.out
Starting program: /Users/mahesh/Desktop/gdb.out gdb.out
Reading symbols for shared libraries +. done
Breakpoint 1, checkString (fileName=0x100000f05 "temp") at gdb.c:6
6 printf("%s", fileName);
(gdb) p fileName
$1 = 0x100000f05 "temp"
(gdb)
答案 1 :(得分:0)
在点击断点后尝试前进一行(gdb“s”命令),然后再次尝试打印。我有时看到gdb在函数开头处断开时无法正确显示参数值。
答案 2 :(得分:0)
我的第一个猜测是存在一个范围问题,因为函数参数的名称和您的全局变量是相同的。但是,对于以下非常小的程序,情况似乎并非如此:
#include <cstdio>
static char const* filename = "something";
int foobar(char const* filename)
{
printf("%s\n", filename);
}
int main(int argc, char** argv)
{
return foobar("somethingelse");
}
编译:
g++ -ggdb -g3 -O0 test.cpp -o test
GDB(7.2,也在x64但Ubuntu上)给出:
Breakpoint 1, foobar (filename=0x400706 "somethingelse") at test.cpp:7
7 printf("%s\n", filename);
(gdb) p filename
$1 = 0x400706 "somethingelse"
所以这不是关于本身的范围。此外,输出表明该参数在执行时确实是一个空字符串。在您进入调试器的同时,能否请我们提供bt
的输出?最后两个堆栈帧就足够了。