2013-03-04 40 views
11

我在.h文件中有一個類相關聯的可執行代碼:斷點當前不會被擊中。這條線

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

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

我試圖找出爲什麼我的代碼不工作,所以我設置一個斷點裏面的條件WriteMessage() funcition,但只要我開始運行在調試模式下的項目斷點淡出,併爲它提示說:

斷點目前不會受到打擊。
沒有與此行關聯的可執行代碼。

我不知道爲什麼會發生這種情況,因爲其他類的所有其他成員函數在.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); 
} 
+1

你的代碼是否曾經調用過'Blah :: WriteMessage'? – us2012 2013-03-04 16:04:57

+0

您可能沒有將WriteMessage與任何處於執行路徑的關聯關聯,因此編譯器會拋出此代碼。簡單地說,這段代碼從未執行過 – SomeWittyUsername 2013-03-04 16:05:48

+3

你可能正在調試發行版本或過時的版本? – 2013-03-04 16:05:58

回答

9

我建議你先刪除輸出文件:物理刪除所有生成的DLL,PDB和EXE。然後再次編譯(重建)以生成文件。有時Visual Studio會在構建解決方案時「迷失」和「忘記」覆蓋輸出文件。

造成這種情況的其他一些原因:

  • 調試器使用的代碼是從應用程序運行
  • PDB文件調試器使用的代碼不同的是,來自不同應用程序正在運行的代碼
  • 應用程序正在運行的代碼已被優化,調試信息已被除去。
  • 在上尚未加載到進程尚未
+1

仔細看看症狀,我想我可能會遇到「調試器使用的代碼與應用程序正在運行的代碼不同」。我無法在某些功能中設置斷點,但它們似乎沒有斷點就可以正常運行。另外,改變函數並不會改變我的程序運行的方式。任何想法可能會造成這種情況? – xcdemon05 2013-03-04 20:16:51

+0

使用Process Monitor(可從Microsoft下載)檢查您實際正在調試哪個可執行文件,並將其與正在構建的可執行文件進行比較。 – 2013-03-04 20:33:33

+0

我試圖進入一個函數,我無法設置斷點內,我得到了這個錯誤信息:http://i.imgur.com/iI8AfpU.png – xcdemon05 2013-03-04 21:18:36

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語句return ar但是編譯器從來沒有抱怨。編譯器並沒有抱怨的原因是我用的是操作者錯誤(和而從不使用它)

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

因爲誤我通過指針訪問操作,我對象的<<運營商從來沒有真正被調用,這就是爲什麼編譯器沒有抱怨,因爲它從來沒有被使用過。

所以首先我固定調用代碼

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

現在,運算符重載方法埋怨return聲明,我固定的太大。

我現在可以進入該功能。所以底線是沒有設置中斷點,因爲這段代碼基本上被編譯器(正確地)排除了,因爲它從來沒有用在代碼中。

7

我結束了這個問題,我的應用程序的上下文是C#中的一個主要應用程序,它在我想從調試器中進入的較低層中使用非託管C++代碼。從C#項目屬性中,我進入了Debug選項卡,並在Enable Debuggers部分下選中了「啓用非託管代碼調試」。

C# Project Properties Debug Tab

+2

儘管我的問題與C#無關,但我對此表示讚賞,因爲它最接近解決它。 當在C++中運行託管(CLR)和非託管代碼時,將調試器類型設置爲「混合」很重要,否則它將跳過任何非託管代碼。 – 2014-11-04 16:34:37

+0

我同意上面的評論者(當試圖調試C++程序時,上述屬性頁不可用)。將調試設置爲「native」或「auto」不起作用,但顯然是「混合」。謝謝! – Pierre 2014-12-05 23:06:50

+0

+1,正如Digital_Utopia所說,我不得不**手動**設置我的(非CLR)C++項目使用「混合」而不是「自動」,只是爲了拉入我的.lib文件。 – egrunin 2015-05-23 15:12:44

0

想提一提,我移植的時候我的一些舊的MFC (managed--using clr support)項目納入VS2015經歷了"Breakpoint will not be hit..."錯誤。

什麼固定的問題,對我來說是這樣設置:

Configuration Properties\Linker\Debugging\Debuggable Assembly

...這樣的:

Yes (/ASSEMBLYDEBUG)

1

我也想用我自己的解決方案,以插入內容。我有一個C++項目加載一個由C++/CLR代碼組成的DLL。事實證明,我必須將啓動項目的調試器類型設置爲「混合」。 「自動」未檢測到它需要託管支持,因爲在程序啓動後手動加載了dll。

+0

男人,你救了我的一天!我有完全相同的問題,這真的幫助! Thx對此評論很多。 – Daniel 2018-03-08 20:31:04