2012-06-26 40 views
3

我有一個C#DLL with native exports,這是從一些德爾福2009年代碼調用。 Delphi代碼使用LoadLibraryGetProcAddress來訪問導出的函數。我想在運行時調試代碼的託管部分,但我遇到了麻煩。調試混合Delphi(本地)和C#代碼,得到「二進制沒有調試信息」

當我啓動應用程序時,斷點顯示正確,但未能命中。

我的當前設置如下:在Visual Studio中設置爲「啓動外部程序」 2010

  • 項目的調試設置

    • C#DLL項目,在德爾福可執行指點。
    • 啓用非託管代碼調試關閉。
    • 僅我的代碼在調試選項啓用(這似乎沒有什麼區別)

    我試圖使非託管代碼調試,但會導致一個錯誤說「二進制建沒有調試信息」。如果我繼續,所有斷點都被禁用。

    當我檢查模塊列表時,可執行文件顯示爲沒有調試符號。 Delphi不會生成一個PDB(它不能,因爲它是一個封閉規格的專有格式),但它會生成一個MAP文件。我查看了MAP-to-PDB轉換器工具,但似乎只有一個工具可以完成我所需要的工作。

    我不是在調試從Visual Studio中的Delphi代碼很感興趣,因爲我已經可以做到的是,在CodeGear的Delphi的IDE,但有沒有辦法來調試運行時的託管代碼在這種情況呢?

  • 回答

    4

    好的,我找到了一個解決方案。問題不在於調試符號,而在於正在調試的代碼類型。如果從項目啓動設置中啓動應用程序,調試器將以混合模式啓動,這需要使用本機符號才能捕獲從本機代碼調用的C#代碼。

    我無法讓Visual Studio接受由tds2dbg創建的pdb文件,所以我找到了解決方法。爲了確保調試器在託管模式下啓動,重視過程,而不是啓動它,就像這樣:

    1. 調試 - >附加到進程...
    2. 選擇正在運行的進程。
    3. 單擊「附加到」右側的「選擇...」按鈕。
    4. 選擇「調試這些代碼類型」
    5. 檢查Managed(v2.0,v1.1,v1.0)適用於.NET 3.5或更低版本,或Managed(v4.0)適用於.NET 4.0或更高版本。不知道爲什麼v3.5被排除在命名之外。
    6. 單擊確定,單擊附加。

    在此之後,所有的斷點應該很好地工作:)

    1

    有一個「tds2pdb」你可以嘗試創建一個.pdb文件: http://code.google.com/p/map2dbg/downloads/detail?name=tds2pdb102.zip

    注:這不是一個完整的.pdb文件(規格不可用),但至少它是工作組痕跡。但是,並非所有的符號(類,變量,參數)都被導出。但你可以隨時嘗試...

    +0

    的Delphi編譯器/連接器不產生一個TDS文件。 – Polynomial

    +0

    呃,問題是關於調試託管代碼。這個答案與問題無關。 –

    +2

    @Polynomial:較新的版本有一個生成外部調試文件(* .tds)的選項。 –