【问题标题】:Breakpoint will not currently be hit. No executable code associated with this line断点当前不会被命中。没有与此行关联的可执行代码
【发布时间】:2013-02-18 18:55:33
【问题描述】:

我在 .h 文件中有一个类:

class Blah
{
public:
    Blah(){}
    virtual ~Blah(){}

    void WriteMessage( bool MessageReceived )
    {
        if(MessageReceived)
        {
            cout << "Message Recieved\n";
        }
    }
};

我试图弄清楚为什么我的代码不起作用,所以我在 WriteMessage() 函数内的条件上设置了一个断点,但是当我开始在调试模式下运行项目时,断点消失了,并且它的工具提示说:

目前不会命中断点。
没有与此行关联的可执行代码。

我不知道为什么会发生这种情况,因为其他类的所有其他成员函数在 .h 文件中实现时都可以正常工作。这是什么原因造成的?

编辑:好的,按照要求,这是我正在使用的真实代码的精简版:

VimbaBridgeAPI.h(.dll 的头文件)

#pragma once

#ifdef VIMBABRIDGEAPI_EXPORTS
#define VIMBABRIDGEAPI_API __declspec(dllexport)
#else
#define VIMBABRIDGEAPI_API __declspec(dllimport)
#endif

#include "AlCamIncludes.h"
#include "VimbaSystem.h"

////////////////////////////////////////////
//  Global Variables ///////////////////////
////////////////////////////////////////////
extern HBITMAP hbit;
extern CEdit* global_filenamehandle;

////////////////////////////////////////////
//  Global Flags ///////////////////////////
////////////////////////////////////////////
extern bool imageReady;
extern bool take_picture;

using namespace AVT::VmbAPI;

VIMBABRIDGEAPI_API void BridgedGetImage(FramePtr framepoint, VmbUchar_t** imgDat);

VIMBABRIDGEAPI_API HBITMAP ExternalFrameRecieved( const FramePtr pFrame );

//////////////////////////////////////////////////////////////////////////
//////////  MyObserver class   ///////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
class VIMBABRIDGEAPI_API MyObserver : public IFrameObserver
{
private:
    MyObserver( MyObserver& );

    MyObserver& operator=( const MyObserver& );

    //class member variables
    //BITMAPINFO*             pbmi;
    CEdit*                  m_filenameedit;

public:

    MyObserver(CameraPtr pCamera) : IFrameObserver(pCamera) {}
    virtual ~MyObserver() {}

    void FrameReceived ( const FramePtr pFrame );
};

注意: IFrameObserver 不是我写的,但 FrameReceived 函数是在 IFrameObserver 类中声明的纯虚函数。他们的文档说,每当有帧进入时,他们的 API 都会调用 FrameRecieved,我必须实现该功能。我已经测试过这个函数并且它可以工作,但只有在类外部定义时(在里面我得到了我现在得到的错误)

VimbaBridgeAPI.cpp(对用户隐藏的代码)

void FrameRecieved( const FramePtr pFrame )
{
    DbgMsg(L"Frame Received\n");

    ////////////////////////////////////////////////////////////////////////
    //////////  Setup Bitmap  ////////////////////////////////////////////////
    //////////////////////////////////////////////////////////////////////////

    //// FILEHEADER ////
    BITMAPFILEHEADER* bf = new BITMAPFILEHEADER;
    bf->bfType = 0x4d42;
    bf->bfSize = 6054400 + 54 + sizeof(BITMAPINFO);
    bf->bfOffBits = 54;

    //// INFOHEADER ////
    BITMAPINFOHEADER* bih = new BITMAPINFOHEADER;
    bih->biSize = 40;
    bih->biWidth = 2752;
    bih->biHeight = -2200;
    bih->biPlanes = 1;
    bih->biBitCount = 32;
    bih->biCompression = 0;
    //bi->biSizeImage = 6054400; //not required
    bih->biXPelsPerMeter = 2835;
    bih->biYPelsPerMeter = 2835;
    bih->biClrUsed = 0;
    bih->biClrImportant = 0;

    //// INFO ////
    BITMAPINFO* pbmi = (BITMAPINFO*)alloca( sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD)*256);
    pbmi->bmiHeader.biSize = sizeof (pbmi->bmiHeader);
    pbmi->bmiHeader.biWidth = 2752;
    pbmi->bmiHeader.biHeight = -2200;
    pbmi->bmiHeader.biPlanes = 1;
    pbmi->bmiHeader.biBitCount = 8;
    pbmi->bmiHeader.biCompression = BI_RGB;
    pbmi->bmiHeader.biSizeImage = 0;
    pbmi->bmiHeader.biXPelsPerMeter = 14173;
    pbmi->bmiHeader.biYPelsPerMeter = 14173;
    pbmi->bmiHeader.biClrUsed = 0;
    pbmi->bmiHeader.biClrImportant = 0;

    //create grayscale color palette
    for(int i=0; i<256; i++)
    {
        pbmi->bmiColors[i].rgbRed = BYTE(i);
        pbmi->bmiColors[i].rgbGreen = BYTE(i);
        pbmi->bmiColors[i].rgbBlue = BYTE(i);
        pbmi->bmiColors[i].rgbReserved = BYTE(0);
    }

    //// IMAGE DATA ////
    VmbUchar_t* imageData = NULL;
    BridgedGetImage(pFrame, &imageData);

    //////////////////////////////////////////////////////////////////////////
    ////// Create image that's printed to dialog box /////////////////////////
    //////////////////////////////////////////////////////////////////////////
    HDC hdc = ::GetDC(NULL);  
    hbit = CreateDIBitmap(hdc, bih, CBM_INIT, imageData, pbmi, DIB_RGB_COLORS);

    //clean up
    DeleteObject(bf);
    DeleteObject(bih);
    DeleteObject(hdc);
}

【问题讨论】:

  • 你的代码有没有调用过Blah::WriteMessage?
  • 您可能没有将您的WriteMessage 与执行路径上的任何内容相关联,因此编译器会抛出此代码。简单地说,这段代码永远不会被执行
  • 您是在调试发布版本还是过时的版本?
  • 1) 是的。多次。 2) 你到底是什么意思? 3)没有。
  • 好吧,如果您声称它正在执行,请在其中一条调用行上放置一个断点,然后从那里逐步执行。

标签: c++ windows visual-studio-2010 class debugging


【解决方案1】:

我建议你首先删除输出文件:物理删除所有生成的 DLL、PDB 和 EXE。然后再次编译(重建)以生成文件。有时,在您构建解决方案时,Visual Studio 可能会“迷失”和“忘记”覆盖输出文件。

这可能有其他几个原因:

  • 调试器使用的代码与应用程序运行的代码不同
  • 调试器正在使用的 pdb 文件与应用程序正在运行的代码不同
  • 应用程序运行的代码已经过优化,调试信息已被剥离。
  • 您在其中设置断点的代码尚未加载到进程中

【讨论】:

  • 仔细观察症状,我想我可能会遇到“调试器正在使用的代码与应用程序正在运行的代码不同”。我无法在某些函数中设置断点,但它们似乎仍然可以在没有断点的情况下运行。此外,更改功能不会改变我的程序运行方式。知道是什么原因造成的吗?
  • 使用 Process Monitor(可从 Microsoft 下载)检查您实际调试的可执行文件,并将其与正在构建的可执行文件进行比较。
  • 我试图进入其中一个我无法在其中设置断点的函数,我收到了这个错误消息:i.imgur.com/iI8AfpU.png
  • 我确实这样做了,但它似乎不起作用,所以我重新添加了断点一行,这似乎神奇地让 VS 回到了正轨。如果我还记得的话,重新定位断点似乎对我有用过一次,因为这曾经发生在我身上。我正在使用 VS2013 Express Web。
  • 这适用于我在 VS 2013 中的 Web 应用程序项目。我必须做另外一件事,必须使用 Internet Explorer 作为 VS 2013 中的默认浏览器。
【解决方案2】:

我也遇到了这个问题,我的应用程序的上下文是 C# 中的一个主应用程序,它在我想从调试器进入的较低层中使用非托管 C++ 代码。从 C# 项目属性中,我进入了“调试”选项卡,在“启用调试器”部分下选中了“启用非托管代码调试”。

【讨论】:

  • 虽然我的问题与 C# 无关,但我赞成这一点,因为它最接近解决它。在 C++ 中运行托管(CLR)和非托管代码时,将调试器类型设置为“混合”很重要,否则它将跳过任何非托管代码。
  • 我同意上面的评论者(尝试调试C++程序时,上面的属性页不可用)。将调试设置为“本机”或“自动”不起作用,但显然“混合”可以。谢谢!
  • +1,正如 Digital_Utopia 所说,我必须手动将我的(非 CLR)C++ 项目设置为使用“混合”而不是“自动”,只是为了加入我的 .lib 文件。
  • +1,它不仅解决了我的问题,而且我发现其他人的箭头绘制技能和我一样糟糕。
  • 而在 VS2013 中称为“启用本机代码调试”。感谢您的帮助!
【解决方案3】:

想提一下,我在将一些较旧的 MFC (managed--using clr support) 项目移植到 VS2015 时遇到了 "Breakpoint will not be hit..." 错误。

对我来说解决问题的是设置这个:

Configuration Properties\Linker\Debugging\Debuggable Assembly

...到这个:

Yes (/ASSEMBLYDEBUG)

【讨论】:

    【解决方案4】:

    我也想加入我自己的解决方案。我有一个 C++ 项目加载一个由 C++/CLR 代码组成的 dll。结果,我不得不将启动项目的调试器类型设置为“混合”。 “自动”没有检测到它需要托管支持,因为 dll 是在程序启动后手动加载的。

    【讨论】:

    • 伙计,你拯救了我的一天!我有完全相同的问题,这真的很有帮助!非常感谢此评论。
    • 我遇到了相反的问题 - 即使大部分代码都是本机的,“自动”选择也是托管的。
    【解决方案5】:

    对我来说,答案是:

    Project Properties-&gt;C/C++-&gt;Optimization

    将优化设置为:“禁用 (/Od)”

    【讨论】:

      【解决方案6】:

      我遇到了同样的问题,但清理文件的公认解决方案对我不起作用。我的问题已解决,这与我的代码有关。这是我修复的详细信息,希望它为您的修复提供一些线索。

      我正在做的是为我的结构重载 CArchive &lt;&lt; 运算符,但代码从未介入其中。我会设置断点,然后得到实心红色符号。一旦我启动调试器,符号就会被勾勒出来,并且上面的警告消息说:

      当前不会命中断点。没有可执行代码与此行关联

      我的相关代码在断点没有中断的地方。

      class Book
      {
           friend CArchive& operator << (CArchive& ar, const Book & book )
           {
      
               ar << book.title;
               ar << "\r\n";
               ar << book.price;
               ar << "\r\n";
           }
      }
      

      现在这段代码有一个明显的问题是它没有返回语句return ar,但编译器从未抱怨过。编译器没有抱怨的原因是我错误地使用了运算符(而不是从不使用它)

      book *mybook = new Book(...);
      ar << mybook;
      

      因为我错误地通过指针访问运算符,所以我的对象的 &lt;&lt; 运算符从未真正被调用过,这就是为什么编译器也没有抱怨,因为它从未被使用过。

      所以我首先修复了调用代码

      book *mybook = new Book(...);
      ar << *mybook;
      

      现在运算符重载方法抱怨return 语句,我也修复了它。

      我现在可以进入函数了。所以底线是没有设置断点,因为这段代码基本上被编译器(正确地)搁置了,因为它从未在代码中使用过。

      【讨论】:

        【解决方案7】:

        我试图按Ctrl+F5,这与您在 Visual Studio Code 中收到的错误相同。但是,一旦我转到Debug 部分并按下初始化 的绿色按钮,调试帮助我解决了这个错误。

        【讨论】:

          【解决方案8】:

          如果您使用的是 CLion,请尝试将 -DCMAKE_BUILD_TYPE=Debug 添加到您的 CMake 选项中:

          【讨论】:

            【解决方案9】:

            我在尝试在 IntelliJ 中调试 Rust 项目时遇到了这个问题。原来问题出在.cargo/config文件中,rustflags变量被设置为包含--compress-debug-sections=zlib-gabi。这显然剥夺了 IntelliJ 激活调试器所需的信息。暂时删除该标志会删除“断点当前不会被命中”消息,并允许调试器按预期工作。

            【讨论】:

              猜你喜欢
              • 2018-10-22
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2020-06-26
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多