簡體   English   中英

我如何調試在外部C#應用程序中切換的C ++ DLL(無法從調試器啟動)

[英]How can i debug C++ DLLs SWIGed in external C# app (that can not be started from debugger)

我無法想象如何調試托管應用程序中使用的C ++部分代碼。 我似乎在一個更具體的情況下,其他現存的類似問題

背景:

  • 我想調試我的C ++ DLL
  • 他們用Swig包裹在C#中
  • 我還為使用包裝的C#dll的應用程序構建了C#插件
  • 該應用程序無法從調試器啟動,我必須在之后附加它
  • 我在VS2015中以調試和x64模式構建了所有內容(c#dll實際上位於'AnyCPU'平台中,'Prefer-32-bit'未標記)
  • 我正處於運行代碼的適當環境中(代碼工作的其他部分),它只是C ++部分中的一個錯誤,當它從C#部分發生時我想調試它

我嘗試將程序作為C ++ DLL的外部調試程序啟動(指定'混合'調試,或作為C#dll的外部調試程序(啟用'本機代碼調試')。但我認為這些選項可能會被忽略,因為我無法在調試器中啟動exe,只是在事后附加到進程。我附加了選擇Native和Managed調試器的進程。我只能破解我的托管代碼

在VS 2015的Debug輸出窗口中,我沒有看到可執行文件試圖加載我的C ++ dll,但我看到它們在查看進程資源管理器時被加載。 swig(或托管應用程序的插件系統)可能正在加載c ++ dll

有幫助的技巧嗎?

您說“我試圖將程序作為C ++ DLL的外部調試程序啟動...但是我認為這些選項可能會被忽略,因為我無法在調試器中啟動exe ...”。 我想這可能是你出錯的地方。

您需要將C ++ DLL項目設置為啟動項目(右鍵單擊該項目,然后選擇“設置為啟動項目”)。 然后打開項目的屬性頁面,在Debugging下,在Command字段中輸入應用程序可執行文件的完整路徑。 輸入Command Arguments字段中所需的任何命令行參數。 還要確保您的DLL項目在C ++ / General下生成PDB。 清理並重建DLL項目。

在您希望調用的函數中設置斷點 - 理想情況下,在入口點附近的某個位置,以及要調試的代碼中的另一個斷點。 現在開始調試(F5)。 應用程序應該運行(斷點可能會顯示為“挖空”,並顯示斷點未綁定或類似的消息 - 不要擔心這一點)。 執行應用程序中所需的任何操作以調用本機DLL。 加載DLL及其PDB時,斷點應顯示為不透明,並在執行代碼行時被擊中。

如果斷點未命中/未綁定,我建議將C ++ DLL及其PDB復制到應用程序可執行文件夾中,以減少加載錯誤DLL的機會。 然后重新啟動調試器。 如果您的應用程序以編程方式設置工作文件夾,請嘗試將DLL / PDB復制到此位置。

如果失敗,則可能是因為呼叫者針對的目標與被呼叫者不兼容。 通常,不建議混合使用調試和釋放模式代碼,尤其是在編組數據時。 在發布模式(包括PDB)中重建DLL,並按照上述說明運行。 盡管有時由於優化而很難,但是仍然可以調試發布模式代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM