断点不会被打中。 没有与此行关联的可执行代码

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

class Blah { public: Blah(){} virtual ~Blah(){} void WriteMessage( bool MessageReceived ) { if(MessageReceived) { cout << "Message Recieved\n"; } } }; 

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

断点不会被打中。
没有与此行关联的可执行代码。

我不知道为什么发生这种情况,因为其他类的所有其他成员函数在.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类中声明的纯虚函数。 他们的文档说FrameRecieved每当一个帧进来时都被API调用,而且我必须实现这个函数。 我已经testing了这个function,它的工作原理,但只有在课堂外定义(在我得到我现在得到的错误)

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); } 

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

这可能会发生其他一些原因:

  • 调试器正在使用的代码与应用程序正在运行的代码不同
  • 调试器正在使用的pdb文件与应用程序正在运行的代码不同
  • 应用程序正在运行的代码已被优化,调试信息已被删除。
  • 你有断点的代码还没有加载到进程中

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

C#项目属性调试选项卡

我有同样的问题,但接受的解决方案清理文件不适合我。 我有我的问题解决,它必须与我的代码。 这里是我的修复的细节,希望它给你的修复一些线索。

我在做的是重载CArchive <<运算符为我的结构,但代码从来没有步入它。 我会设置断点,并得到坚实的红色象征。 只要我启动调试器符号变成概述,它的警告消息说:

断点不会被打中。 没有可执行代码与此行关联

我的相关代码是在断点不破的地方。

 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; 

因为我错误地通过指针访问操作符,所以我的对象的<<操作符从来没有真正被调用,这就是为什么编译器没有抱怨,因为它从来没有被使用。

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

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

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

我现在可以进入功能。 所以底线是没有设置断点,因为这个代码基本上被编译器(正确地)排除了,因为它从来没有用在代码中。

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

什么解决了我的问题是设置这个:

Configuration Properties\Linker\Debugging\Debuggable Assembly

对此:

Yes (/ASSEMBLYDEBUG)

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