GDB 在函数结束处中断而不是指定断点

Posted

技术标签:

【中文标题】GDB 在函数结束处中断而不是指定断点【英文标题】:GDB breaks at the end of function instead of specified breakpoint 【发布时间】:2014-11-15 18:02:38 【问题描述】:

这很奇怪,我试图使用 gdb 调试我的一个程序。

这是相关的代码

   137
   138  void solve() 
   139      string input1, input2;
   140      cin >> input1;
   141      cin >> input2;
   142      reverse(input1.begin(), input1.end());
   143      reverse(input2.begin(), input2.end());
   144      ll i1 = atoi(input1.c_str());
   145      ll i2 = atoi(input2.c_str());
   146      cout << i1<<" "<<i2;
   147      ll out = i1+i2;
   148      while(out%10 == 0) 
   149          out = out%10;
   150          cout << out;
   151          cout <<"per: "<< out%10<<endl;
   152      
   153      cout << "Sum: "<<out;
   154      string output = to_string(out);
   155      reverse(output.begin(), output.end());
   156      cout << endl;
   157      cout << output << '\n';
   158  
   159
   160  int main(int argc, char **argv) 
   161      //string s = (argc == 1) ? argv[0] : "file.test";
   162      //freopen(s.substr(s.find("/") + 1,s.rfind(".")-2).append(".test").c_str(),"r",stdin);
   163      ll t,j;
   164      scanf("%lld",&t);
   165      while(t--) 
   166          solve();
   167      
   168      return 0;
   169  

我有一个使用

编译文件的脚本
g++ -g -O2 -std=gnu++0x -static -Wall -Wextra -std=c++11 -Isrc -rdynamic -fomit-frame-pointer -o addrev.out addrev.cpp

所以我所做的是,我在第 149 行设置了一个断点。但是当我运行它时,它在 158 处中断,我从未提及。

这是 gdb 的输出:

-rw-r--r--. 1 chaudhary chaudhary 5.4K Nov 15 23:17 addrev.cpp
-rwxrwxr-x. 1 chaudhary chaudhary  87K Nov 15 23:17 addrev.out*
chaudhary@localhost:~/code/codpro/spoj$ gdb addrev.out 
GNU gdb (GDB) Fedora 7.7.1-21.fc20
Copyright (C) 2014 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 addrev.out...done.
(gdb) b 149
Breakpoint 1 at 0x40186c: file addrev.cpp, line 149.
(gdb) l 149
144         ll i1 = atoi(input1.c_str());
145         ll i2 = atoi(input2.c_str());
146         cout << i1<<" "<<i2;
147         ll out = i1+i2;
148         while(out%10 == 0) 
149             out = out%10;
150             cout << out;
151             cout <<"per: "<< out%10<<endl;
152         
153         cout << "Sum: "<<out;
(gdb) r < addrev.test 
Starting program: /home/chaudhary/code/codpro/spoj/addrev.out < addrev.test
42 1Sum: 43
34

Breakpoint 1, solve () at addrev.cpp:158
158     
(gdb) c
Continuing.
8534 457Sum: 8991
1998

Breakpoint 1, solve () at addrev.cpp:158
158     
(gdb) c
Continuing.
503 4970per: 0
0per: 0
0per: 0
0per: 0
0per: 0
0per: 0
.
.
.
Infinite loop

是否有某些特定原因导致它在函数末尾而不是断点处中断。

【问题讨论】:

您不应该在优化的情况下进行调试。使用-O0-Og 当目标调试时,我会去掉编译器命令行上的大多数优化标志。你也应该删除-fomit-frame-pointer 【参考方案1】:

GDB 调试器通常会在最近的汇编语言指令处中断。

由于优化,有时源代码列表与汇编语言列表不匹配。

尝试打印包含汇编语言与源代码交错的列表。你会看到它在哪里中断。

此外,设置断点的位置是调试器的策略。一些调试器喜欢在多行语句的第一行设置断点;其他人喜欢把它放在最后。

内联代码还将“调整”触发断点时执行停止的位置以及您可以设置断点的位置。

为了在源代码和调试器之间获得最佳关联,请关闭所有优化。首先让您的代码在没有优化的情况下正常工作,然后根据需要进行优化,

【讨论】:

以上是关于GDB 在函数结束处中断而不是指定断点的主要内容,如果未能解决你的问题,请参考以下文章

linux下使用gdb的断点设置

Linux编程基础——GDB(设置断点)

Linux编程基础——GDB(设置断点)

中断 gdb (llvm) 中的命名空间函数

使用 Infineon XMC4800 MCU 和 Segger 进行 GDB 调试中断而无断点

常用 GDB 命令中文速览