You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 13:10:49