VS2010中C++項目文件的用處小結(有轉載的也有自己寫的)

在使用Visual Studio 2010開發C++程序的時候,會發現有一些奇怪的文件被創建出來,比如一個叫ipch的文件夾,和一個與工程同名的.sdf文件,而且ipch下面的文件和.sdf文件都很大,至少有10M,大項目可能超過100M,那這些文件是幹什麼用的呢?這些文件是Visual Studio用來保存預編譯的頭文件Intellisense用的,刪除這些文件對於工程的開發完全沒有影響。那如果我既想使用預編譯的頭文件和Intellisense,又不想看到這些無聊的文件該怎麼辦呢?

在Visual Studio裏進入如下設置:進入“Tools > Options”,選擇“Text Editor > C/C++ > Advanced”,然後找到“Fallback Location”。然後把“Always use Fallback Location”和“Do Not Warn if Fallback Location Used”設置成“True”就可以了,如下圖:

如果想把這些文件保存到特定的文件夾,就要設置一下Fallback Location,否則Visual Studio會用系統的臨時文件夾來保存這些文件。

然後重啓Visual Studio,那些討厭的文件就不見了。這個設置對於像我這樣使用Dropbox來同步代碼的人來說尤其有用。

2.pdb文件

一 什麼是PDB文件

大部分的開發人員應該都知道PDB文件是用來幫助軟件的調試的。但是他究竟是如何工作的呢,我們可能並不熟悉。本文描述了PDB文件的存儲和內容。同時還描 述了debugger如何找到binay相應的PDB文件,以及debugger如何找到與binay對應的源代碼文件。本文適用於所有的Native和 Managed的開發人員。 

在開始前,我們先定義2個術語:private build, 用來表示在開發人員自己機器上生成的build;public build,表示在公用的build機器上生成的build。private build相對來說比較簡單,因爲PDB和binay在相同的地方,通常地我們遇到的問題都是關於public build。  
 
所有的的開發人員需要知道的最重要的事情是”PDB文件跟源代碼同樣的重要“, 沒有PDB文件,你甚至不能debugging。對於public build,需要symbol server存儲所有的PDB,然後當用戶報告錯誤的時候,debugger纔可以自動地找到binay相應的PDB文件, visual studio 和 windbg都知道如何訪問symbol server。在將PDB和binay存儲到symbol server前,還需要對PDB運行進行source indexing, source indexing的作用是將PDB和source關聯起來。  
 
接下來的部分假設有已經設置好了symbol server和source server indexing。TFS2010中可以很簡單地完成對一個新的build的source indexing 和 symbol server copying。
 

二 PDB文件的內容

正式開始PDB的內容,PDB不是公開的文件格式,但是Microsoft提供了API來幫助從PDB中獲取數據。
 
Native C++ PDB包含了如下的信息:
 * public,private 和static函數地址;
 * 全局變量的名字和地址;
 * 參數和局部變量的名字和在堆棧的偏移量;
 * class,structure 和數據的類型定義;
 * Frame Pointer Omission 數據,用來在x86上的native堆棧的遍歷;
 * 源代碼文件的名字和行數;
 
.NET PDB只包含了2部分信息:
 * 源代碼文件名字和行數;
 * 和局部變量的名字;
 * 所有的其他的數據都已經包含在了.NET Metadata中了;  
 

三 PDB如何工作

當你加載一個模塊到進程的地址空間的時候,debugger用2中信息來找到相應的PDB文件。第一個毫無疑問就是文件的名字,如果加載 zzz.dll,debugger則查找zzz.pdb文件。在文件名字相同的情況下debugger還通過嵌入到PDB和binay的GUID來確保 PDB和binay的真正的匹配。 所以即使沒有任何的代碼修改,昨天的binay和今天的PDB是不能匹配的。可以使用dempbin.exe來查看binary的GUID。 
 
在VisualStudio中的modules窗口的symbol file列可以查看PDB的load順序。第一個搜索的路徑是binary所在的路徑,如果不在binary所在的路徑,則查找binary中hardcode記錄的build目錄,例如obj\debug\*.pdb, 如果以上兩個路徑都沒有找到PDB,則根據symbol server的設置,在本地的symbol server的cache中查找,如果在本地的symbol server的cache中沒有對應的PDB,則最後纔到遠程的symbol server中查找。通過上面的查找順序我們可以看出爲什麼public build和private build的PDB查找不會衝突。 
 
對於private build有時我們需要在別人的機器上debug的情況,需要將相應的PDB與binary一起拷貝,對於加入GAC的.NET的binary,需要將PDB文件拷貝到C:\Windows\assembly\GAC_MSIL\Example\1.0.0.0__682bc775ff82796a類似的binary所在的目錄。另一個變通的方法是定義環境變量DEVPATH,從而代替使用命令GACUTIL將binary放入GAC中。在定義DEVPATH後,只需要將binary和PDB放到DEVPATH的路徑,在DEVPATH下的binary相當於在GAC下。使用DEVPATH,首先需要創建目錄且對當前build用戶有寫權限,然後創建環境變量DEVPATH且值爲剛纔創建的目錄,然後在web.config,app.config或machine.config中開啓development模式,啓動對DEVPATH的使用 
<configuration> 
   <runtime> 
      <developmentMode developerInstallation="true"/> 
   </runtime> 
</configuration> 

在你打開了development模式後,如果DEVPATH沒有定義或路徑不存在的話會導致程序啓動時異常"Invalid value for registry"。而且如果在machine.config中開啓DEVPATH的使用會影響其他的所有的程序,所以要慎重使用machine.config。 
 
最後開發人員需要知道的是源代碼信息是如何存儲在PDB文件中的。對於public builds,在運行source indexing tool後,版本控制工具將代碼存儲到你設置的代碼cache中。對於private builds,只是存儲了PDB文件的全路徑,例如在c:\foo下的源文件mycode.cpp,在pdb文件中存儲的路徑爲c:\foo\mycode.cpp。對於private builds可以使用虛擬盤來增加PDB對絕對路徑的依賴,例如可以使用subst.exe將源代碼路徑掛載爲V:,在別人的機器上debug的時候也掛載V:。

3.sln文件

用於Vs的打開文件


 4..vcxproj.filters
.vcxproj.user
.vcxproj.filters 用於項目下文件的虛擬目錄
.vcxproj.user 是用戶的一些相關配置




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章