断点当前不会被击中.没有与此行关联的可执行代码

xcd*_*n05 13 c++ windows debugging class visual-studio-2010

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

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

    void WriteMessage( bool MessageReceived )
    {
        if(MessageReceived)
        {
            cout << "Message Recieved\n";
        }
    }
};
Run Code Online (Sandbox Code Playgroud)

我试图弄清楚为什么我的代码不起作用,所以我在函数内部的条件设置了一个断点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 );
};
Run Code Online (Sandbox Code Playgroud)

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

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);
}
Run Code Online (Sandbox Code Playgroud)

小智 13

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

这可能由于其他一些原因而发生:

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


jxr*_*mos 7

我也遇到了这个问题,我的应用程序的上下文是C#中的主要应用程序,它在较低层使用了非托管C++代码,我想从调试器中进入.从C#项目属性我进入Debug选项卡,在Enable Debuggers部分下面选中了"Enable unmanaged code debugging".

C#项目属性调试选项卡

  • 虽然我的问题与C#无关,但我还是支持这个,因为它最接近于解决它.在C++中运行托管(CLR)和非托管代码时,将调试器类型设置为"混合"非常重要,否则它将跳过任何非托管代码. (2认同)
  • +1,它不仅解决了我的问题,还发现了其他人的画箭技巧和我一样糟糕。 (2认同)

IV.*_*IV. 7

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

为我解决这个问题的原因是:

Configuration Properties\Linker\Debugging\Debuggable Assembly

......对此:

Yes (/ASSEMBLYDEBUG)