Не может видеть переменные в GDB

2118
StoneThrow

Я новичок в Cygwin (и * nix в этом отношении) и не понимаю следующее поведение GDB. Я создал исполняемый файл, который намеренно приводит к SIGSEGV:

#include <iostream>  void Func(int i) { int* pFoo = NULL; *pFoo = 1; }  int main(int argc, char** argv) { Func(-50); std::cout << "End of main()" << std::endl; } 

Я компилирую свой код, выполнив:

g++ test.cpp 

Используя эту версию G ++:

g ++ - версия

g ++ (GCC) 5.4.0 Copyright (C) 2015 Free Software Foundation, Inc. Это бесплатное программное обеспечение; см. источник для условий копирования. Там нет гарантии; даже не для ИЗДЕЛИИ или ФИТНЕСА ДЛЯ ОСОБЕННОЙ ЦЕЛИ.

Когда я пытаюсь запустить эту программу в GDB, я не могу "увидеть" какие-либо переменные:

>gdb ./a.exe GNU gdb (GDB) (Cygwin 7.10.1-1) 7.10.1 Copyright (C) 2015 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "x86_64-pc-cygwin". Type "show configuration" for configuration details. For bug reporting instructions, please see: <http://www.gnu.org/software/gdb/bugs/>. Find the GDB manual and other documentation resources online at: <http://www.gnu.org/software/gdb/documentation/>. For help, type "help". Type "apropos word" to search for commands related to "word"... Reading symbols from ./a.exe...done. (gdb) r Starting program: /home/user/code/gdbtest/a.exe [New Thread 6500.0x1c84] [New Thread 6500.0x7a0]  Program received signal SIGSEGV, Segmentation fault. 0x000000010040111d in Func(int) () (gdb) bt #0 0x000000010040111d in Func(int) () #1 0x000000010040113c in main () (gdb) f 0 #0 0x000000010040111d in Func(int) () (gdb) p i No symbol "i" in current context. (gdb) p pFoo No symbol "pFoo" in current context. (gdb) info locals No symbol table info available. (gdb) f 1 #1 0x000000010040113c in main () (gdb) p argc No symbol "argc" in current context. (gdb) 

Может кто-нибудь объяснить, почему это происходит и как я могу исправить проблему?

Я также попытался скомпилировать с использованием "g ++ -Og test.cpp", но это не привело к изменениям, описанным выше.

0

2 ответа на вопрос

0
MAP

Как описано в руководстве по GDB (которое вы, вероятно, должны были сначала проверить), вы должны указать компилятору включить информацию о переменных, которые нужны GDB. Добавьте -gпереключатель в строку вашего компилятора:

g++ -g test.cpp 
Я смогу проверить ваше предложение через несколько часов. Однако до этого: отправленная вами ссылка гласит: «gcc, компилятор gnu C / C ++, поддерживает« -g »с или без« -O », что позволяет отлаживать оптимизированный код». В своем первоначальном посте я отметил, что я также скомпилировал с помощью "g ++ -Og test.cpp". Можете ли вы объяснить это несоответствие? Второй вопрос: в действующей системе * nix (против cygwin из оригинального поста) я скомпилировал с g ++ без явного «-g», но gdb способен видеть символы в этой среде. g ++ не имеет псевдонима "g ++ -g". Знаете ли вы, почему это расхождение может быть? Спасибо. StoneThrow 8 лет назад 0
You should click the check mark by the answer to tell the computer that. It can't understand the text, and the check makes it rate this question higher when people are searching the Q&A. MAP 8 лет назад 0
0
matzeri

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

Смена имени ;-)

$ g++ -ggdb -O0 prova.cpp -o prova 

куда

-ggdb is the option for adding the debug info -O0 disable all the optimization -o provide a name to the binary other than the default a.exe 

Раздел отладки будет:

$ gdb prova GNU gdb (GDB) (Cygwin 7.10.1-1) 7.10.1 ... Reading symbols from prova...done. (gdb) run Starting program: /tmp/prova/prova [New Thread 6404.0x404] [New Thread 6404.0x231c] [New Thread 6404.0x1960] [New Thread 6404.0x11b4]  Program received signal SIGSEGV, Segmentation fault. 0x00000001004010f7 in Func (i=-50) at prova.cpp:6 6 *pFoo = 1; (gdb) bt #0 0x00000001004010f7 in Func (i=-50) at prova.cpp:6 #1 0x0000000100401122 in main (argc=1, argv=0xffffcc30) at prova.cpp:11 
Это сработало (как и просто "-g"). Все еще любопытно, почему «-Og» не работает, так как мое чтение руководства привело меня к мысли, что так и должно быть. Также любопытно, почему ни «-g», ни «-ggdb» не требуются на моем рабочем ПК (что является истинным * nix). Просто любопытно по этим вопросам, но вы решили мой запрос; благодарю вас. StoneThrow 8 лет назад 0

Похожие вопросы