2011-04-22 85 views
15

上週我發佈了Linux和windows版本的應用程序。剝離符號的最佳方式

在發佈之後,我們意識到符號沒有被剝離,我的經理認爲(我不同意)它可能允許用戶理解我們的算法。現在,我將不得不清理符號並重新發布應用程序。

我的問題,

  1. 什麼是Linux的剝離符號的最佳方法?
  2. 在Windows中去除符號的最佳方式是什麼?
+0

我認爲調試符號_could_可以幫助人們理解你的算法。如果他們在程序執行過程中的不同位置檢查調用堆棧,並且他們可以看到描述性函數名稱,那麼... – 2011-04-22 00:40:40

+0

根據應用程序的構建方式,剝離還可以減少大量應用程序佔用空間(特別是如果你使用大量的靜態庫)!一般來說,剝離是您運送任何物品的好習慣。 – photoionized 2011-04-22 00:42:31

回答

21

在Windows上使用Visual C++(以及其他Microsoft編譯器)時,符號不是二進制文件的一部分。相反,它們存儲在稱爲「程序數據庫」文件(.pdb文件)的單獨文件中。只是不提供.pdb文件。

使用GNU工具鏈,您可以使用strip從二進制文件中刪除符號。

+2

如果你有私人ms pdb的,並且想將它們轉換爲公共的,你可以將這個答案[私人公開](http://stackoverflow.com/questions/1525648/how-can-i-convert-private-pdb -to-公共PDB/1526031#1526031) – msh 2011-04-22 04:53:23

13

對於GNU工具鏈,存在手的很酷的花招:

objcopy --only-keep-debug yourprogram ../somepath/yourprogram.dbg 
strip yourprogram 
objcopy --add-gnu-debuglink=../somepath/yourprogram.dbg 

現在你可以壓縮你的程序所在的文件夾(或將其打包成一個安裝程序或其他),就不會有更多的調試它中的符號。
但是:如果啓動調試器或運行諸如addr2lineobdump之類的工具,該工具將(通過調試鏈接信息)自動知道在哪裏找到符號並加載它們。

這真是太棒了,因爲這意味着您擁有在您的終端上使用符號的好處,而無需將它們分發給用戶。