我在.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类中声明的纯虚拟。他们的文档说每当一个帧进来时,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);
}
答案 0 :(得分:9)
我建议您首先删除输出文件:物理删除所有生成的DLL,PDB和EXE。然后再次编译(重建)以生成文件。有时Visual Studio会“迷路”并“忘记”在构建解决方案时覆盖输出文件。
这可能由于其他一些原因而发生:
答案 1 :(得分:7)
我也遇到了这个问题,我的应用程序的上下文是C#中的主要应用程序,它在较低层使用了非托管C ++代码,我想从调试器中进入。在C#项目属性中,我进入了Debug选项卡,在Enable Debuggers部分下面选中了“启用非托管代码调试”。
答案 2 :(得分:7)
想要提及我将部分旧的"Breakpoint will not be hit..."
项目移植到MFC (managed--using clr support)
时遇到VS2015
错误。
为我解决这个问题的原因是:
Configuration Properties\Linker\Debugging\Debuggable Assembly
......对此:
Yes (/ASSEMBLYDEBUG)
答案 3 :(得分:2)
我也想用我自己的解决方案。我有一个C ++项目加载一个由C ++ / CLR代码组成的DLL。事实证明,我不得不将启动项目的调试器类型设置为“混合”。 “Auto”未检测到它需要托管支持,因为在程序启动后手动加载了dll。
答案 4 :(得分:1)
对我来说,答案是:
Project Properties->C/C++->Optimization
将优化设置为:“禁用(/ Od)”
答案 5 :(得分:0)
我遇到了同样的问题,但是已经接受的清理文件的解决方案并不适用于我。我解决了我的问题,这与我的代码有关。以下是我的修复的详细信息,希望它能为您的修复提供一些线索。
我正在做的是为我的结构重载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
语句,我也修复了它。
我现在可以进入这个功能了。所以底线是没有设置断点,因为这个代码基本上被编译器(正确)限制,因为它从未在代码中使用过。
答案 6 :(得分:0)
答案 7 :(得分:0)
答案 8 :(得分:0)
我在尝试在 IntelliJ 中调试 Rust 项目时遇到了这个问题。事实证明,问题是在 .cargo/config
文件中,rustflags
变量被设置为包含 --compress-debug-sections=zlib-gabi
。这显然剥夺了 IntelliJ 激活调试器所需的信息。暂时删除该标志会删除“当前不会命中断点”消息,并允许调试器按预期工作。