2008-10-09 71 views
6

我通常不能在Windows開發中工作,並且完全不熟悉工具鏈和構建系統。我的嵌入式產品在其文件系統中包含來自第三方的一些Windows DLL(由安裝文件系統的Windows機器使用)。剝離Windows DLL調試信息?

我有一個問題:與以前的版本相比,這些DLL的最新發行版的尺寸已經增加了三倍,並且它們不再適合文件系統。 DLL的功能沒有太多變化,所以我懷疑開發者忘了在這個下拉菜單中去掉調試符號。我會問他們,但由於時區和語言的差異,得到答案往往需要幾天的時間。

有人可以解釋一下,對於不熟悉VisualC的人使用簡單步驟,如何確定DLL是否仍包含調試信息以及如何去除它?

回答

3

即使很痛苦,您也會希望從開發人員那裏獲得發佈版本,因爲默認情況下,調試版本是在禁用代碼優化的情況下編譯的。所以,即使你以某種方式除去了調試信息,你仍會留下代碼效率不高的代碼。 (更不用說無論調試陷阱和消息可能在那裏。)

至於確定什麼樣的DLL你有,你可以使用Dependency Walker看看你的DLL是否鏈接到調試或發佈版本的VC運行時庫(假設這些庫不是靜態鏈接的)。

5

通常,調試信息本身是作爲單獨的*.pdb文件(程序數據庫)構建的,而不是像UNIX中那樣附加到二進制文件中。如果開發者確實構建了庫的調試版本,則更嚴重的問題可能是依賴關係。如果發佈版本的二進制文件鏈接到MSVCRT.DLL,則調試版本將鏈接到MSVCRTD.DLL(其他運行時庫類似地用D後綴命名)。要找到一個特定的二進制的依賴關係,請嘗試:

dumpbin /imports whatever.dll 

這將顯示所有的庫whatever.dll的運行時依賴(注意,從這些庫都庫名稱和符號列出)。如果您沒有看到期望的依賴項列表,則可能只有通過讓原始開發人員以正確的構建模式重新構建庫才能解決問題。

5

Rebase是Microsoft工具集的一部分。除了設置dll的基址之外,它還可以將任何附加的調試信息解壓到單獨的.dbg文件中。

底墊-i 0x10000000的-a -x。\ -p

你應該在理論上試圖確定如果DLL已經開始建造一個獨特的基地址,並使用它。或者,選擇一個基地址以儘可能減少與應用程序使用的任何其他dll碰撞的機會,以便窗口在加載時不必修補dll。在這樣一個時代,加載器通常隨機地將模塊的加載地址作爲安全特性進行隨機化。我不確定它的價值在於特別設置基地址。

2

依賴項沃克確實顯示依賴項,但不顯示調試信息是否已被刪除。使用PeStudio可以看到兩者。

0

暫時忽略其他建議,如獲取發佈版本,這是有效的。開發人員尋找的工具實際上是來自Visual Studio(或SDK或WDK)的link.exe

如果他們希望你能夠使用調試器和他們的代碼,他們可以爲你創建公共PDB文件。他們想要使用的選項有:

/PDB:filename 
    /PDBSTRIPPED:filename 

但是,恐怕您自己對此無能爲力。 PDB文件本身是單獨的文件,並且調試信息通常不會包含在現代MS編譯器的二進制文件中(儘管可能包含一些RTTI內容,更不用說ASSERT以及類似的宏和「函數」的文件名和字符串 - 這是對感知膨脹的最可能的解釋)。

注意:來自WDK的binplace.exe提供了與上述標誌相同的功能,但具有更復雜(儘管適用於WDK構建過程)語法。