我有一个.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会在构建解决方案时“丢失”和“忘记”覆盖输出文件。
这可能会发生其他一些原因:
我结束了这个问题,我的应用程序的上下文是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)
项目VS2015
到VS2015
时,我遇到了"Breakpoint will not be hit..."
错误。
什么解决了我的问题是设置这个:
Configuration Properties\Linker\Debugging\Debuggable Assembly
对此:
Yes (/ASSEMBLYDEBUG)
我也想用我自己的解决方案。 我有一个C ++项目加载一个由C ++ / CLR代码组成的dll。 原来,我不得不将启动项目的调试器类型设置为“混合”。 “自动”没有检测到它需要托管支持,因为该程序启动后,手动加载DLL。