最近和c#的同事一起開發乙個程式,我用c++開發sdk的dll,主程式使用c#開發。但是在除錯過程中遇到了一些問題,vs附加c#程式後無法除錯c++**。
在程式執行的過程中,sdk出現了一些問題,我需要除錯c++**。當我使用vs附加到執行的程序後發現c++dll的符號並沒有被載入,斷點無法生效。而且我確定pdb檔案已經和dll檔案放在一起,不可能是找不到pdb檔案。
我首先看了一下輸出視窗的符號檔案載入記錄,發現乙個奇怪的現象:常見的c++執行庫dll和系統dll似乎都沒載入符號,難道偵錯程式只載入了託管dll的符號?我開啟vs的選單欄的除錯/視窗/模組。開啟模組視窗,看了一下所有載入的dll列表,發現確實只有託管dll,沒有c++的dll。
c++的dll肯定是載入了,不然程式不可能執行,那麼估計是因為vs認出了除錯的是乙個託管程式,所以只載入了託管dll的符號檔案。
顯然除錯c++程式和除錯託管程式使用的偵錯程式是不一樣的。那麼能不能手動指定使用的偵錯程式型別而不讓vs自動選擇呢?
我在vs的官方文件中查到了相應的說明。
在vs中選擇附加程序的對話方塊中程序列表上面有個按鈕可以選擇使用的偵錯程式型別。
vs預設的偵錯程式型別是自動選擇,如果要除錯的程序型別是託管程序那麼vs就自動使用託管偵錯程式,此時如果我想除錯託管程式中的c++dll,應該選擇本機除錯。
我使用了本機偵錯程式後開始除錯,果然正常載入了c++dll的符號檔案,斷點也可以生效。
這個問題我在網上搜尋了好多部落格但並沒有找到解決方案,後來還是在官方文件中找到了說明,網上的部落格中對於託管**和本機**互相呼叫的文章很少,以後遇到這種問題應該先看看官方文件。
C 關於託管程式和非託管程式的區別
一般的乙個可執行檔案的內容都包含乙個pe頭,系統根據pe的資訊找到入口函式,通過執行入口函式中的 來執行可執行程式。託管程式的檔案相對於非託管程式還包含了乙個clr表頭檔案以及其他clr需要的資訊。1.非託管程式的執行過程 在非託管程式中,可執行裡面儲存的是機器 cpu可以直接載入並執行,當系統載入...
C 託管程式中的資源釋放問題
第乙個就是很多人用.net寫程式,會談到託管這個概念。那麼.net所指的資源託管到底是什麼意思,是相對於所有資源,還是只限於某一方面資源?很多人對此不是很了解,其實 net 所指的託管只是針對記憶體這乙個方面,並不是對於所有的資源 因此對於 stream 資料庫的連線,gdi 的相關物件,還有 co...
如何解除安裝其它程序中載入的指定DLL
如何解除安裝其它程序中載入的指定dll 2008 02 17 12 46 include void fastcall unloaddll string str proce,string str dllname flag process32next snapshot,pinfo closehandle...