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:

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/255587.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/255587.shtml
英文地址,請注明出處:http://en.pswp.cn/news/255587.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【pyqt5學習】——graphicView顯示opencv圖像

imgpath "result.jpg"img cv2.imread(imgpath) # 讀取圖像img cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # 轉換圖像通道x img.shape[1] # 獲取圖像大小y img.shape[0]self.zoomscale 1 # 圖片放縮尺度frame QImage(img, x, y, x * 3, QImage.Format_RGB888)…

項目總結——機房收費系統合作版

機房合作就結束了&#xff0c;這次合作開發是第一次與別人一塊兒開發一個系統&#xff0c;收獲還是蠻大的。以下我總結幾點算是經驗吧&#xff0c;供以后參考&#xff1a; 管理上1.計劃在準備合作開發之前我們三個去找米老師&#xff0c;老師給我們規定了時間。半個月。盡管計劃…

CenterOs 防火墻設置

為什么80%的碼農都做不了架構師&#xff1f;>>> 1. 重啟后生效的 開啟&#xff1a; chkconfig iptables on 關閉&#xff1a; chkconfig iptables off 2. 及時生效 開啟&#xff1a; service iptables start 關閉&#xff1a; service iptables stop 查看防火墻規則…

設計模式六大原則(3)——依賴倒置原則

定義&#xff1a;高層模塊不應該依賴低層模塊&#xff0c;二者都應該依賴其抽象&#xff1b;抽象不應該依賴細節&#xff1b;細節應該依賴抽象。 問題由來&#xff1a;類A直接依賴類B&#xff0c;假如要將類A改為依賴類C&#xff0c;則必須通過修改類A的代碼來達成。這種場景下…

【機器學習——決策樹】——兩種方法實現,含模型的保存和調用

目錄 1、ID3算法 2、使用sklearn API——模型保存和調用成功 1、ID3算法 以下實現了決策樹的創建、可視化繪制、決策樹的保存和調用 但是在利用決策樹進行預測的時候出現錯誤 分類代碼 #實用決策樹進行分類 def classify(inputTree, featLabels, testVec): firstStr = in…

重溫 const 指針

在進行聲明指針時&#xff0c;可以在類型前或后使用關鍵字const&#xff0c;也可在兩個位置都使用。 下面都是合法的聲明&#xff0c;但是含義大不同&#xff1a; const int * pOne; //指向整形常量 的指針&#xff0c;它指向的值不能修改 int * const pTwo; //指向整…

提交MTBF eservice以及log注意事項

[DESCRIPTION]提交MTBFeservice需要注意的描述&#xff0c;log事項[SOLUTION]提交MTBF eservice時&#xff0c;請注意1.描述清楚問題現象2. 描述清楚問題發生的時間點3.描述清楚問題發生時在run的case提交log時請注意1.MTBF的log通常會很大&#xff0c;若log太大&#xff0c;只…

Apache Cassandra和Apache Ignite:關系并置和分布式SQL

為什么80%的碼農都做不了架構師&#xff1f;>>> 在上一篇文章中&#xff0c;回顧和總結了Cassandra中使用的查詢驅動數據模型&#xff08;或者說非常規數據模型&#xff09;方法論的缺陷。事實證明&#xff0c;如果不對查詢有深入的了解&#xff0c;通過該方法論將…

Android高級開發專題晉升班

Android高級開發專題晉升班 適用人群&#xff1a;1-3年以上經驗的開發者丨學員平均薪酬20K/月轉載于:https://www.cnblogs.com/lythonliu/p/6285531.html

使用opencv簡單的播放AVI程序(40行)

學習OPENCV的第一個例子 #include <highgui.h> #include <cassert> #include <iostream> #include <Windows.h> using namespace std; void OnTrackbarSlide(int pos);int g_slider_position 0; CvCapture *g_capture NULL; int main(int argc , cha…

【糾錯】——mysql Authentication plugin ‘caching_sha2_password‘ is not supported問題處理

mysql Authentication plugin ‘caching_sha2_password’ is not supported問題處理 使用mysql8.0版本&#xff0c;登錄失敗&#xff0c;提示 Authentication plugin ‘caching_sha2_password’ is not supported。 原因是在MySQL 8.0以后&#xff0c;默認的密碼加密方式是cac…

關于EL表達式取值的問題

EL表達式取值時,如果沒有指定作用域,EL表達式會自動按照作用域的大小,從小到大依次去找;比如${s},會自動按照"pageContext,request,session,application"的順序去找屬性名為s的屬性.如果找到,則顯示.否則,什么都不顯示. 當Map中存整數時,如果想采用EL表達式取值,Map的…

統計信息自動收集任務失效原因排查

環境&#xff1a;Oracle 11.2.0.3 RAC問題&#xff1a;統計信息自動收集任務失效原因排查 1.查看自動任務的狀態2.進一步查看其它信息3.解決問題1.查看自動任務的狀態 查看自動任務的狀態&#xff0c;確認是enabled狀態&#xff1a; SQL> select client_name,status from db…

Markdown使用

#一級標題 ##二級標題 ###三級標題 斜體 粗體 斜體粗體 代碼段> 刪除內容效果是&#xff1a; 這是一級標題 這是二級標題 這是三級標題 這是斜體這是粗體這是斜體粗體 代碼段 FileInputStream is new FileInputStream("text"); byte[] iput new byte[1024]; is.…

灰度圖的width和widthstep的區別

灰度圖的width是表示圖像的每行像素數&#xff0c;widthstep指表示存儲一行像素需要的字節數。 在OpenCV里邊&#xff0c;widthStep必須是4的倍數&#xff0c;從而實現字節對齊&#xff0c;有利于提高運算速度。 如果8U單通道圖像寬度為3&#xff0c;那么widthStep是4&#xff…

【pyradiomics學習】——安裝pyradiomics以及簡單示例

目錄 數據集下載&#xff1a; 示例代碼 參考文獻&#xff1a; bug修復 運行結果&#xff1a; 數據集下載&#xff1a; https://www.jianguoyun.com/p/DcEwQq0Q45bOBxj09JYC (訪問密碼: gd8dmv) 示例代碼 #!/usr/bin/env python # -*- coding: utf-8 -*- # Time : 20…

最新Django2.0.1在線教育零基礎到上線教程(九)

演示地址&#xff1a; http://mxonline.mtianyan.cn 教程倉庫地址1: https://github.com/mtianyan/DjangoGetStarted 教程倉庫地址2: https://github.com/mtianyan/Mxonline2 教程倉庫地址3: https://github.com/mtianyan/Mxonline3 9-1 講師列表頁 teacherlist 和 teacher det…

過濾器 攔截器 區別

轉 http://www.cnblogs.com/wangyuyu/archive/2013/07/02/3167354.html1、攔截器是基于java的反射機制的&#xff0c;而過濾器是基于函數回調 2、過濾器依賴與servlet容器&#xff0c;而攔截器不依賴與servlet容器 3、攔截器只能對action請求起作用&#xff0c;而過濾器則可以對…

php --魔術常量 /魔術方法

魔術常量&#xff1a;1. __LINE__返回文件中的當前行號。2. __FILE__返回所在文件的完整路徑。包含文件名3. __FUNCTION__返回所在函數名稱。4. __CLASS__返回所在類的名稱。5. __METHOD__返回所在類方法的名稱。需要注意__METHOD__返回的是"class::function"的形式&…

【pyradiomics學習】——影像組學特征

目錄 1、形狀特征&#xff08;14個&#xff09; 2、一階特征&#xff08;18個&#xff09; 灰度共生矩陣特征&#xff08;24個&#xff09; 灰度區域大小矩陣特征&#xff08;16個&#xff09; 灰度行程矩陣特征&#xff08;16個&#xff09; 鄰域灰度差矩陣特…