MinGW64编译C++代码时GDB中break语句断点无法触发的问题
调试C++代码时break语句断点无法命中的问题
我在调试C++代码时,在break语句行设置断点后,该断点始终无法命中。我使用Windows下的MinGW64编译代码,已添加-g编译标志且未使用任何优化标志。
复现代码
#include <iostream> #include <random> using namespace std; static default_random_engine generator(0); // 随机种子 static normal_distribution<double> normal; static uniform_real_distribution<double> uniform; static exponential_distribution<double> expo; int main() { int k_max = round(uniform(generator)*100+3); double c = 0; for (int k=0;k<k_max;k++) { double a = expo(generator); double b = normal(generator); if ( a*b<a+b) { c *= 1.5; if (sqrt(a+1) < 0.7) { c += 2*expo(generator); } else if (sqrt(a+2)>2.9) { c += 3*expo(generator); } else { c += expo(generator); } //std::cout<<"Before break"<<std::endl; break; // 断点设置位置 } } cout << c << endl; }
已尝试的操作
我对断点前后的代码进行了反汇编,结果如下:
25 } else { 26 c += expo(generator); 0x0000000140001606 <+438>: lea 0x6a37(%rip),%rax # 0x140008044 <_ZL9generator> 0x000000014000160d <+445>: mov %rax,%rdx 0x0000000140001610 <+448>: lea 0x6a79(%rip),%rax # 0x140008090 <_ZL4expo> 0x0000000140001617 <+455>: mov %rax,%rcx 0x000000014000161a <+458>: call 0x140003180 <_ZNSt24exponential_distributionIdEclISt26linear_congruential_engineIjLj16807ELj0ELj2147483647EEEEdRT_> 0x000000014000161f <+463>: movsd -0x8(%rbp),%xmm1 0x0000000140001624 <+468>: addsd %xmm1,%xmm0 0x0000000140001628 <+472>: movsd %xmm0,-0x8(%rbp) 27 } 28 //std::cout<<"Before break"<<std::endl; 29 break; 0x0000000140001593 <+323>: jmp 0x14000163f <main()+495> 0x0000000140001604 <+436>: jmp 0x14000163f <main()+495> 0x000000014000162d <+477>: jmp 0x14000163f <main()+495> 30 }
疑问
我怀疑GDB调试器仅在其中一条跳转指令中插入INT3指令。如果是这样,我该如何确保断点不被跳过(例如修改编译标志)?或者我在编译和调试过程中是否操作有误?
内容的提问来源于stack exchange,提问作者ChromatinRemodeling
相关产品推荐
相关产品推荐

