У нас есть программа на C ++, такая как:

int&
Instance()
{
    static int test;
    return test;
}

int
main( int argc, char ** argv )
{
    int& test = Instance();
    printf("%d\n",test);
    
    return 0;
}

Теперь я пытаюсь напечатать Instance::test, как это предлагается в документации gdb: https://ftp.gnu.org/old-gnu/Manuals/gdb/html_node/gdb_52.html

Тем не менее, это дает:

(gdb) p Instance::test

No symbol "test" in specified context.

Я компилирую с помощью -O0 -g.

7
Sioux 13 Авг 2014 в 00:44
Мне интересно, является ли неопределенное поведение передачей ссылок на функцию printf, которая ничего не знает о том, что такое ссылка. Мне это кажется неправильным. Я высуну шею - прямо сейчас у меня нет спецификации C ++, но я хеджирую свою ставку на то, что код имеет неопределенное поведение из-за передачи ссылки на printf()
 – 
PaulMcKenzie
13 Авг 2014 в 01:30
Почему это не было бы хорошо? Я использую ссылку, которая приведет к копии целого числа. Единственная проблема, которую я заметил, - это реализация vararg. По моему опыту и в этом примере, он работает нормально. Но это тоже не вопрос
 – 
Sioux
14 Авг 2014 в 06:52
1
The only issue that I could see is with the vararg implementation Это было моей точкой зрения. Кроме того, комментарии предназначены для комментариев, то есть я не публиковал свой комментарий в качестве ответа.
 – 
PaulMcKenzie
14 Авг 2014 в 07:00

1 ответ

Лучший ответ
(gdb) p 'Instance()::test'

У меня работает на Ubuntu 14.04, gdb 7.7, g ++ 4.8.2. Как я узнал, что это был символ?

$ nm -C a.out | grep test
0000000000601040 d Instance()::test
13
Jordan Samuels 13 Авг 2014 в 01:21
3
Правильный. Ключ - это одинарные кавычки.
 – 
Sioux
14 Авг 2014 в 19:59
Да, я должен был обратить на это внимание с самого начала.
 – 
Jordan Samuels
14 Авг 2014 в 20:00
У меня была похожая проблема, и ваш трюк с nm решил ее для меня. Однако символ был prevRev.6906. Это сработало, но что это за символ и как я должен был его угадать?
 – 
Baruch
4 Ноя 2014 в 13:14
Какой компилятор, версию и флаги вы используете? И вы компилируете код в исходном вопросе или другом коде?
 – 
Jordan Samuels
4 Ноя 2014 в 16:21
Другой код. gcc (mingw64) 4.9.2, -g. В моем коде область статической переменной находится не непосредственно в функции, а во внутреннем блоке (он объявлен в блоке if)
 – 
Baruch
5 Ноя 2014 в 01:31