gpt4 book ai didi

gcc - GDB 的下一个命令向后跳转到作用域末尾的所有堆栈分配对象

转载 作者:行者123 更新时间:2023-12-02 04:27:40 27 4
gpt4 key购买 nike

当我在一个作用域中有堆栈分配的对象(大括号内的一组命令),并且我在该作用域的末尾使用 next 时,gdb 跳回到每个堆栈所在的位置- 分配的对象是相反的顺序。

这在调试过程中令人不安:当有很多对象的堆栈分配实例时,调试器会向后跳转到每个实例,只有当它完成后才会继续前进。相反,我希望它继续到作用域之后的下一行。

有没有办法配置 gdb 不这样做,或者这是我在构建时需要传递给 gcc 的一些标志?

起初,我以为是我在使用 -O0 或其他东西 (GDB jumps to wrong lines in out of order fashion) 进行编译,但事实并非如此。

下面是我的构建方式:

/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”时,它似乎向后跳转。

查看“next”命令的 gdb 手册,我没有看到任何关于 C++ 构造函数/析构函数的内容。

最佳答案

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

您可能正在遭受自残。

STABS debugging format是古老的,不应在 15 年以下的任何系统上使用。它也完全不足并且完全未经测试。

libgcc-4.4.7-17.el6.x86_64

您还在使用 2012 年 3 月发布的古老 GCC-4.4.7。使用更现代的版本可能会获得更好的调试体验。

关于gcc - GDB 的下一个命令向后跳转到作用域末尾的所有堆栈分配对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52360140/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com