GDB неправильно печатает строковое значение - PullRequest
1 голос
/ 02 марта 2011

У меня есть многопоточная (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 показывает имя файла какпусто, тогда как 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

Спасибо за помощь.

Ответы [ 3 ]

0 голосов
/ 02 марта 2011

Попробуйте шагнуть вперед на одну строку (команда gdb "s") после того, как вы достигнете точки останова, затем попробуйте распечатать ее снова. Иногда я видел, как gdb не может правильно отображать значения параметров при разрыве в начале функции.

0 голосов
/ 02 марта 2011

Мое первое предположение заключалось в том, что существует проблема с областью видимости, поскольку имя параметра функции и ваша глобальная переменная идентичны. Однако, похоже, что это не относится к следующей очень маленькой программе:

#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 в то же время, когда вы входили в отладчик? Достаточно двух последних кадров стека.

0 голосов
/ 02 марта 2011

Возможно, что-то пошло не так в вашем коде. С помощью следующего фрагмента кода я получаю строку, напечатанную 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) 
...