2010-04-28 23 views
0

我遇到了一個相當奇怪的行爲,我甚至不知道如何開始描述。 我寫了一段託管C++代碼,可以調用本地方法。爲什麼在不進行優化的情況下調試託管C++時,VS2005會跳過執行行?

A(非常)簡化了代碼看起來像這樣的版本(我知道它看起來像一個完整的原生功能,只承擔有管理的東西被全部完成過的地方):

int somefunction(ptrHolder x) 
{ 
    // the accessptr method returns a native pointer 
    if (x.accessptr() != nullptr) // I tried this with nullptr, NULL, 0) 
    { 
    try 
    { 
     x->doSomeNativeVeryImportantStuff(); // or whatever, doesn't matter 
    } 
    catch (SomeCustomExceptionClass &) 
    { 
     return 0; 
    } 
    } 

    SomeOtherNativeClass::doStaticMagic(); 

    return 1; 
} 

我編譯這段代碼時沒有使用/ clr標誌(VS.NET 2005,SP2)進行優化,並且在調試器中運行它時,我得到了if語句,因爲指針實際上是空的,我不輸入if,但令人驚訝的是,光標直接跳轉到return 1語句,完全忽略doStaticMagic()方法!!!

查看彙編代碼時,我發現它確實直接跳轉到該行。 如果我強制調試器輸入if塊,我也按F10後跳到返回1語句。

任何想法爲什麼會發生這種情況?

感謝, 林依晨

回答

1

你嘗試檢查代碼實際上是發出了SomeOtherNativeClass :: doStaticMagic();線?也許編譯器找不到它(或找到一個空函數或類似的東西),因此跳過它。

第二個想法:或許你正在比較兩個無法通過使用nullptr進行比較的東西。所以你會得到一個異常,它會被捕獲並導致你直接退出該方法。

+0

你說得對。託管C++在引發異常並且未處理異常時執行異常行爲,執行跳轉到最後一個返回行,在調試器中看起來令人困惑。 – Sakin 2010-05-11 12:23:53

1

難道是VS2005中的Just My Code功能?它默認啓用。

從MSDN:

有時候,當你正在調試, 你可能想看看只有你所編寫的代碼 而忽略其他 代碼,比如系統調用。你可以用Just My Code調試來做 。只需 我的代碼隱藏非用戶代碼,以使其 未出現在調試器 窗口中。當你步,調試器 逐步通過任何非用戶代碼,但 不停止在它。

爲了區分用戶代碼非用戶代碼(「我的代碼」) ,僅我的代碼看起來 在三件事情:DBG文件,PDB文件, 和優化。

相關問題