Я новичок в 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", но это не привело к изменениям, описанным выше.

2 ответа2

0

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

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

$ 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
0

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

g++ -g test.cpp

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .