【问题标题】:C++ breakpoints are ignored / missedC++ 断点被忽略/错过
【发布时间】:2015-01-15 23:11:20
【问题描述】:

我正在尝试运行一些别人给我的 C++ 代码。起初,istream 文件的链接断开了,我通过添加包含路径来修复它:

C:\Program Files (x86)\Embarcadero\RAD Studio\7.0\include\dinkumware

代码现在可以编译,但它不会在任何断点处停止,例如formcreate 中的断点:

// Initialise the form and read in the module and inverter names.
void __fastcall TMain::FormCreate(TObject *Sender)
{
    ifstream inits;
    ifstream inverters;
    ifstream modules;
    char line[1000];
    AnsiString FTO;
    inits.open("PVSM.ini", ios::in);
    if (inits.is_open())
    {
            inits.getline(line,1000);
            AnsiString parmm(line);
            ModDir = parmm.SubString(1,parmm.Pos(" ")-1);
            inits.getline(line,1000);
            AnsiString parmi(line);
            InvDir = parmi.SubString(1,parmi.Pos(" ")-1);
            inits.getline(line,1000);
            AnsiString parmt(line);
            MetDir = parmt.SubString(1,parmt.Pos(" ")-1);
            inits.getline(line,1000);
            AnsiString parms(line);
            ShdDir = parms.SubString(1,parms.Pos(" ")-1);
            inits.getline(line,1000);
            AnsiString parmx(line);
            ExpDir = parmx.SubString(1,parmx.Pos(" ")-1);
    }
    else    // Should never get here, but if ini file missing use defaults
    {
        ModDir = "C://";
        InvDir = "C://";
        MetDir = "C://";
        ShdDir = "C://";
    }
    inits.close();
    FTO = InvDir + "inverters.data";
    inverters.open(FTO.c_str(), ios::in);
    if (inverters.is_open())
    {
            while ( inverters.getline(line,1000) )
            {
               AnsiString inverter(line);
               IVBox->Items->Add(inverter);
            }
    }
    inverters.close();
    FTO = ModDir + "modules.data";
    modules.open(FTO.c_str(), ios::in);
    if (modules.is_open())
    {
            while ( modules.getline(line,1000) )
            {
               AnsiString module(line);
               ModBox->Items->Add(module);
            }
    }
    modules.close();
    CMod = 1;
    CStr = 1;
    CCell = 1;
    nStore = 0;
    grid = true;
    pasan = false;
    debug = false;
    calc = false;
    cell = false;
    module = false;
    array1 = false;
    inv = false;
    PV = true;
    Parray = false;
    Pcurve = false;
    LastType = 'X';
    CurrTp = -1;  //* Not currently set
    AllSame = true;
    LdMeteo = false;
    mpp = true;
}

它只是打开表单,就好像它是从 .exe 文件运行一样,除了它显示

正在编译 MyProject.cbproj(发布配置).... 成功

在消息栏中

我尝试从发布模式切换到调试模式,尝试更改输出目录以便编译新的.obj 文件。没有成功。

我正在运行Rad studio 2010,它最初是用XE5 编写的,但我认为这是文件夹结构而不是IDE 版本的问题?

有什么建议吗?

【问题讨论】:

  • 在发布版本中,许多断点不能被命中,因为该代码是内联的。调试 Debug 构建(或非优化版本,如果这对您的上下文有意义),或者在 不能 内联的地方设置断点并从那里开始,或者学习阅读程序集并设置断点在那里。
  • formcreate 方法只被调用一次并且没有被标记为内联。我无法想象它会被编译器自动内联?
  • 通过“标记”,我假设你的意思是 declare - 如果你 声明它inline,它仍然只是一个 hint - 编译器几乎总是比开发人员更清楚什么时候应该内联或不内联。也就是说,请粘贴 formcreate 函数,我们很可能能够判断它是否可能被内联。
  • 感谢 Johann,我已将代码添加到原始问题中

标签: c++ debugging c++builder breakpoints c++builder-2010


【解决方案1】:

一些可能对您有用或可能没用的想法(来自各种来源):

  • 确保您正在使用 Debug 配置 并执行项目的 Build,而不仅仅是编译:切换回调试配置并在之后进行编译发布版本还不够
  • 在您的 Win32(Debug) 项目选项中,确保将以下选项设置为正确的值

    • 【C++编译器】→【调试】→【调试信息】= True;
    • 【C++编译器】→【调试】→【调试行号信息】= True;
    • [C++ 编译器] → [优化] → [禁用所有优化] = True;
    • [C++ 编译器] → [优化] → [生成尽可能快的代码] = False;
    • [C++ 链接器] → [完整调试信息]= True;
    • 【Delphi编译器】→【优化】= False;
    • 【Delphi编译器】→【使用调试.dcus】= True;

    (例如,MDI 应用程序的default configuration template 错误)

  • 删除所有.pch.#.tds文件,让编译器重新创建
  • 如果您在 VirtualBox 下运行 IDE,请考虑某些版本存在断点问题 (v4.3.x)

作为最后的手段,您可以尝试{ _asm { int 3 } }simulate a breakpoint

还请看:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-30
    • 1970-01-01
    • 2016-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-20
    相关资源
    最近更新 更多