Следующая команда GDB переходит назад ко всем выделенным в стеке объектам в конце области видимости - PullRequest
0 голосов
/ 17 сентября 2018

Когда у меня есть объекты, выделенные в стеке в области (набор команд в фигурных скобках), и я использую next в конце этой области, GDB возвращается туда, где находится каждый из объектов, выделенных в стеке,в обратном порядке.

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

Есть ли способ настроить gdb, чтобы он этого не делал, или это какой-то флаг, который мне нужно передать gcc при сборке??

Сначала я подумал, что я компилирую, используя -O0 или что-то еще ( GDB переходит на неправильные строки не по порядку ), но это не тот случай.

Вот как я строю:

/opt/rh/devtoolset-6/root/usr/bin/c++  -MD -DDEBUG -g -ggdb -gstabs+  -fPIC  -Wall -Werror -Wsynth -Wno-comment -Wreturn-type   main.cpp -c -o main.o
/opt/rh/devtoolset-6/root/usr/bin/c++  -MD -DDEBUG -g -ggdb -gstabs+  -fPIC  -Wall -Werror -Wsynth -Wno-comment -Wreturn-type   main.o -L. -L/opt/rh/devtoolset-6/root/usr/lib64 -lstdc++  -o main.exe   

Ниже приведено то, что я вижу в отладчике.Обратите внимание на версию GDB:

bash-4.2$ gdb main.exe
GNU gdb (GDB) Red Hat Enterprise Linux 7.12.1-48.el6
Copyright (C) 2017 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-redhat-linux-gnu".
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 main.exe...done.
(gdb) b main
Breakpoint 1 at 0x400a27: file main.cpp, line 45.
(gdb) r
Starting program: /home/brentg/scratch_sandboxes/cxxminimal/main.exe 
Missing separate debuginfos, use: debuginfo-install glibc-2.12-1.192.el6.x86_64

Breakpoint 1, main (argc=1, argv=0x7fffffffeb38, envp=0x7fffffffeb48)
    at main.cpp:45
45    std::cout << __FILE__ << ":" << __LINE__ << ":" << "main begin" << std::endl;
Missing separate debuginfos, use: debuginfo-install libgcc-4.4.7-17.el6.x86_64 libstdc++-4.4.7-17.el6.x86_64
(gdb) l
40    std::cout << __FILE__ << ":" << __LINE__ << ":" << "printing some info 2" << std::endl;
41  }
42  
43  int main(int argc, char *argv[], char *const envp[])
44  {
45    std::cout << __FILE__ << ":" << __LINE__ << ":" << "main begin" << std::endl;
46    some_function_that_uses_Foo();
47    std::cout << __FILE__ << ":" << __LINE__ << ":" << "main end" << std::endl;
48    return 0;
49  } // end main
(gdb) n
main.cpp:45:main begin
46    some_function_that_uses_Foo();
(gdb) s
some_function_that_uses_Foo () at main.cpp:38
38    std::cout << __FILE__ << ":" << __LINE__ << ":" << "printing some info 1" << std::endl;
(gdb) n
main.cpp:38:printing some info 1
39    Foo the_foo1;
(gdb) n
40    std::cout << __FILE__ << ":" << __LINE__ << ":" << "printing some info 2" << std::endl;
(gdb) l
35  
36  void some_function_that_uses_Foo()
37  {
38    std::cout << __FILE__ << ":" << __LINE__ << ":" << "printing some info 1" << std::endl;
39    Foo the_foo1;
40    std::cout << __FILE__ << ":" << __LINE__ << ":" << "printing some info 2" << std::endl;
41  }
42  
43  int main(int argc, char *argv[], char *const envp[])
44  {
(gdb) n
main.cpp:40:printing some info 2
39    Foo the_foo1;

В этот момент я задаюсь вопросом: почему я вернулся на линию 39?Когда я был на 40-й строке, вводя слово «next», то оно, похоже, перепрыгивает назад.

Глядя в руководство gdb для команды «next», я ничего не вижу в отношении конструкторов / деструкторов C ++.

1 Ответ

0 голосов
/ 18 сентября 2018

/opt/rh/devtoolset-6/root/usr/bin/c++ -MD -DDEBUG -g -ggdb -gstabs+ ...

Возможно, вы страдаете от ран, нанесенных самому себе.

Формат отладки STABS древний и не должениспользоваться в любой системе младше 15 лет.Это также неадекватно и полностью не проверено.

libgcc-4.4.7-17.el6.x86_64

Вы также используете древний GCC-4.4.7, который был выпущенв марте 2012 года. Вероятно, вы получите лучший опыт отладки, используя более современную версию.

...