① c++的exe文件和exp文件是什麼玩意
C++的exe文件是可執行文件,該文件是依據開發者的源代碼而生成的。如果有exe,則表明該文件是window下面的執行文件
exp是符號表導出文件,裡麵包含了一些可被外部使用的符號文件。雖然大部分編譯後的代碼有這個文件,但是並不一定有效。僅在源代碼中明確導出介面的情況有效果。默認情況下,該文件沒有什麼有價值的信息。
② DUMPBIN.EXE的備注
CLRHEADER 顯示有關在任何託管程序中使用的 .NET 頭的信息。輸出顯示 .NET 頭及其中各節的位置和大小(以位元組計)。
File Format Spec.doc 描述 .NET 頭中的信息。NET SDK 將 File Format Spec.doc 安裝在 Tools Developers Guide 目錄中。
只有/HEADERS DUMPBIN 選項可用於由/GL 編譯器選項產生的文件。
/DIRECTIVES
此選項轉儲圖像中由編譯器生成的 .directive 節。
只有/HEADERS DUMPBIN 選項可用於由/GL 編譯器選項產生的文件。
/DEPENDENTS
轉儲圖像從中導入函數的 DLL 的名稱。不要轉儲導入函數名。
只有/HEADERS DUMPBIN 選項可用於由/GL 編譯器選項產生的文件。
/DISASM
此選項顯示代碼段的反匯編,如果出現在文件中則使用符號。
只有/HEADERS DUMPBIN 選項可用於由/GL 編譯器選項產生的文件。
/EXPORTS
此選項顯示從可執行文件或 DLL 導出的所有定義。
只有/HEADERS DUMPBIN 選項可用於由/GL 編譯器選項產生的文件。
/FPO
此選項顯示框架指針優化 (FPO) 記錄。
只有/HEADERS DUMPBIN 選項可用於由/GL 編譯器選項產生的文件。
/HEADERS
此選項顯示文件頭和每節的頭。當用於庫時,顯示每個成員對象的頭。
只有/HEADERS DUMPBIN 選項可用於由/GL 編譯器選項產生的文件。
/IMPORTS[:file]
此選項顯示導入到可執行文件或 DLL 的 DLL 列表(靜態鏈接的和延遲載入)和上述每個 DLL 的各個導入。
可選 file 規范允許指定僅顯示某個 DLL 的導入。例如:
mpbin /IMPORTS:msvcrt.dll
此選項顯示的輸出與/EXPORTS 輸出相似。
只有/HEADERS DUMPBIN 選項可用於由/GL 編譯器選項產生的文件。
/LINENUMBERS
此選項顯示 COFF 行號。如果對象文件是用程序資料庫 (/Zi)、C7 兼容 (/Z7) 或僅限行號 (/Zd) 編譯的,則它包含行號。如果可執行文件或 DLL 是與生成調試信息 (/DEBUG) 鏈接的,則它包含 COFF 行號。
只有/HEADERS DUMPBIN 選項可用於由/GL 編譯器選項產生的文件。
/LINKERMEMBER[:{1|2}]
此選項顯示庫中定義的公共符號。指定參數 1 將按對象順序顯示符號及其偏移量。指定參數 2 將顯示對象的偏移量和索引號,然後按字母順序列出這些符號及每個符號的對象索引。若要兩個輸出都獲得,指定不帶數字參數的 /LINKERMEMBER。
只有/HEADERS DUMPBIN 選項可用於由/GL 編譯器選項產生的文件。
/LOADCONFIG
此選項轉儲 IMAGE_LOAD_CONFIG_DIRECTORY 結構,此結構是由 Windows NT 載入程序使用並在 WINNT.H 中定義的可選結構。
只有/HEADERS DUMPBIN 選項可用於由/GL 編譯器選項產生的文件。
/OUT:filename
此選項指定輸出的 filename。默認情況下,DUMPBIN 將信息顯示到標准輸出。
只有/HEADERS DUMPBIN 選項可用於由/GL 編譯器選項產生的文件。
/PDBPATH[:VERBOSE] filename
此處:
filename
要為其查找匹配 .pdb 文件的 .dll 或 .exe 文件名。
VERBOSE(可選)
報告曾嘗試在其中定位 .pdb 文件的所有目錄。
備注
/PDBPATH 將沿調試器搜索 .pdb 文件的同一路徑搜索計算機,並將報告哪些 .pdb 文件(若有)和 filename 中指定的文件相對應。
使用 Visual Studio 調試器時可能會遇到問題,這是因為調試器對調試文件的不同版本使用 .pdb 文件。
/PDBPATH 將沿下列路徑搜索 .pdb 文件:
檢查可執行文件駐留的位置。
檢查寫入可執行文件的 PDB 的位置。這通常是圖像被鏈接時的位置。
沿 Visual Studio IDE 中配置的搜索路徑檢查。
沿 _NT_SYMBOL_PATH 和 _NT_ALT_SYMBOL_PATH 環境變數中的路徑檢查。
在 Windows 目錄中檢查。
/PDATA
僅用於 RISC 處理器。
此選項從圖像或對象轉儲異常表 (.pdata)。
只有/HEADERS DUMPBIN 選項可用於由/GL 編譯器選項產生的文件。
/RAWDATA[:{1|2|4|8|NONE[,number]]
此選項顯示文件中每節的原始內容。參數控制顯示格式,如下所示:
參數 結果
1 默認值。內容以十六進制位元組顯示,如果內容具有列印的表示形式,則還顯示為 ASCII 字元。
2 內容顯示為十六進制的 2 位元組值。
4 內容顯示為十六進制的 4 位元組值。
8 內容顯示為十六進制的 8 位元組值。
NONE 取消顯示原始數據。此參數對控制 /ALL 輸出很有用。
Number 顯示的行被設置為每行具有 number 個值的寬度。
只有/HEADERS DUMPBIN 選項可用於由/GL 編譯器選項產生的文件。
/RELOCATIONS
此選項顯示對象或圖像中的任何重定位。
只有/HEADERS DUMPBIN 選項可用於由/GL 編譯器選項產生的文件。
/SECTION:section
此選項限制與指定的 section 有關的信息的輸出。
只有/HEADERS DUMPBIN 選項可用於由/GL 編譯器選項產生的文件。
/SUMMARY
此選項顯示有關節的最少信息(包括總大小)。如果未指定其他選項,則此選項為默認值。
只有/HEADERS DUMPBIN 選項可用於由/GL 編譯器選項產生的文件。
/SYMBOLS
此選項顯示 COFF 符號表。符號表存在於所有對象文件中。而對於圖像文件,只有當它是與 /DEBUG 鏈接的時,它才包含 COFF 符號
③ WinDbg怎麼用
什麼是WinDBG? WinDbg是微軟開發的免費源碼級調試工具。Windbg可以用於Kernel模式調試和用戶模式調試,還可以調試Dump文件。由於大部分程序員不需要做Kernel模式調試, 我在這篇文章中不會介紹Kernel模式調試。Kernel模式調試對學習Windows核心極有幫助。如果你對此感興趣,可以閱讀Inside Windows 2000和Windbg所帶的幫助文件。這篇文章得主要目的是介紹WINDBG的主要功能以及相關的命令。關於這些命令的詳細語法,請參閱幫助文件。對文章中提到的許多命令,WINDBG有相應的菜單選項。如何得到幫助在命令(Command)窗口中輸入.hh 命會調出幫助文件令。.hh keyword會顯示關於keyword的詳細命令。啟動DebuggerWindbg可以用於如下三種調試:遠程調試:你可以從機器A上調試在機器B上執行的程序。具體步驟如下:
? 在機器B上啟動一個調試窗口(Debug Session)。你可以直接在Windbg下運行一個程序或者將Windbg附加(Attach)到一個進程。? 在機器B的Windbg命令窗口上啟動一個遠程調試介面(remote):.server npipe:pipe=PIPE_NAMEPIPE_NAME是該介面的名字。? 在機器A上運行:windbg –remote npipe:server=SERVER_NAME,pipe=PIPE_NAMESERVER_NAME是機器B的名字。Dump文件調試:如果在你的客戶的機器上出現問題,你可能不能使用遠程調試來解決問題。你可以要求你的用戶將Windbg附加到出現問題的進程上,然後在命令窗口中輸入:
.mp /ma File Name創建一個Dump文件。在得到Dump文件後,使用如下的命令來打開它:windbg –z DUMP_FILE_NAME本地進程調試:你可以在Windbg下直接運行一個程序:
Windbg 「path to executable」 arguments 也可以將Windbg附加到一個正在運行的程序: Windbg –p 「process id」 Windbg –pn 「process name」 注意有一種非侵入(Noninvasive)模式可以用來檢查一個進程的狀態並不進程的執行。當然在這種模式下無法控制被調試程序的執行。這種模式也可以用於查看一個已經在Debugger控制下運行的進程。具體命令如下: Windbg –pv –p 「process id」 Windbg –pv –pn 「process name」 調試多個進程和線程如果你想控制一個進程以及它的子進程的執行,在Windbg的命令行上加上-o選項。Windbg中還有一個新的命令.childdbg 可以用來控制子進程的調試。如果你同時調試幾個進程,可以使用 | 命令來顯示並切換到不同的進程。在同一個進程中可能有多個線程。~命令可以用來顯示和切換線程。調試前的必備工作在開始調試前首先要做的工作是設置好符號(Symbols)路徑。沒有符號,你看到的調用堆棧基本上毫無意義。Microsoft的操作系統符號文件(PDB)是對外公開的。另外請注意在編譯你自己的程序選擇生成PDB文件的選項。如果設置好符號路徑後,調用堆棧看起來還是不對。可以使用lm, !sym noisy, !reload 等命令來驗證符號路徑是否正確。Windbg也支持源碼級的調試。在開始源碼調試前,你需要用.srcpath設置源代碼路徑。如果你是在生成所執行代碼的機器上進行調試,符號文件中的源碼路徑會指向正確的位置,所以不需要設置源代碼路徑。如果所執行代碼是在另一台機器上生成的,你可以將所用的源碼拷貝(保持原有的目錄結構)的一個可以訪問的文件夾(可以是網路路徑)並將源代碼路徑設為該文件夾的路徑。注意如果是遠程調試,你需要使用.lsrcpath來設置源碼路徑。靜態命令:顯示調用堆棧:在連接到一個調試窗口後,首先要知道的就是程序當前的執行情況k* 命令顯示當前線程的堆棧。~*kb會顯示所有線程的調用堆棧。如果堆棧太長,Windbg只會顯示堆棧的一部分。.kframes可以用來設置預設顯示框架數。顯示局部變數:接下來要做通常是用dv顯示局部變數的信息。CTRL+ALT+V可以切換到更詳細的顯示模式。關於dv要注意的是在優化過的代碼中dv的輸出極有可能是不準確的。這時後你能做的就是閱讀匯編代碼來發現你感興趣的值是否存儲在寄存器中或堆棧上。有時後當前的框架(Frame)上可能找不到你想知道的數據。如果該數據是作為參數傳到當前的方法中的,可以讀一讀上一個或幾個框架的匯編代碼,有可能該數據還在堆棧的某個地址上。靜態變數是儲存在固定地址中的,所以找出靜態變數的值較為容易。.Frame(或者在調用堆棧窗口中雙擊)可以用來切換當前的框架。注意dv命令顯示的是當前框架的內容。你也可在watch窗口中觀察局部變數的值。顯示類和鏈表: dt可以顯示數據結構。比如dt PEB 會顯示操作系統進程結構。在後面跟上一個進程結構的地址會顯示該結構的詳細信息:dt PEB 7ffdf000。Dl命令可以顯示一些特定的鏈表結構。顯示當前線程的錯誤值:!gle會顯示當前線程的上一個錯誤值和狀態值。!error命令可以解碼HRESULT。搜索或修改內存:使用s 命令來搜索位元組,字或雙字,QWORD或字元串。使用e命令來修改內存。計算表達式:?命令可以用來進行計算。關於表達式的格式請參照幫助文檔。使用n命令來切換輸入數字的進制。顯示當前線程,進程和模塊信息:!teb顯示當前線程的環境信息。最常見的用途是查看當前線程堆棧的起始地址,然後在堆棧中搜索值。!peb顯示當前進程的環境信息,比如執行文件的路徑等等。lm顯示進程中載入的模塊信息。顯示寄存器的值:r命令可以顯示和修改寄存器的值。如果要在表達式中使用寄存器的值,在寄存器名前加@符號(比如@eax)。顯示最相近的符號:ln Address。如果你有一個C++對象的指針,可以用來ln來查看該對象類型。 查找符號:x命令可以用來查找全局變數的地址或過程的地址。x命令支持匹配符號。x kernel32!*顯示Kernel32.dll中的所有可見變數,數據結構和過程。查看lock:!locks顯示各線程的鎖資源使用情況。對調試死鎖很有用。查看handle:!handle顯示句柄信息。如果一段代碼導致句柄泄漏,你只需要在代碼執行前後使用!handle命令並比較兩次輸出的區別。有一個命令!htrace對調試與句柄有關的Bug非常有用。在開始調試前輸入:!htrace –enable 然後在調試過程中使用!htrace handle_value 來顯示所有與該句柄有關的調用堆棧。顯示匯編代碼:u。程序執行控制命令:設置代碼斷點:bp/bu/bm 可以用來設置代碼斷點。你可以指定斷點被跳過的次數。假設一段代碼KERNEL32!SetLastError在運行很多次後會出錯,你可以設置如下斷點: bp KERNEL32!SetLastError 0x100.在出錯後使用bl 來顯示斷點信息(注意粗體顯示的值):0 e 77e7a3b0 004f (0100) 0:*** KERNEL32!SetLastError重新啟動調試(.restart命令)並設置如下的斷點:bp Kernel32!SetLastError 0x100-0x4fDebugger會停在出錯前最後一次調用該過程的地方。你可以指定斷點被激活時Debugger應當執行的命令串。在該命令串中使用J命令可以用來設置條件斷點:bp `mysource.cpp:143` "j (poi(MyVar)」0n20) ''; 'g' "上面的斷點只在MyVar的值大於32時被激活(g命令條件斷點的用途極為廣泛。你可以指定一個斷點只在特殊的情況下被激活,比如傳入的參數滿足一定的條件,調用者是某個特殊的過程,某個全局變數被設為特殊的值等等。設置內存斷點:ba可以用來設置內存斷點。調試過程中一個常見的問題是跟蹤某些數據的變化。如下的斷點:ba w4 0x40000000 "kb; g"可以列印出所有修改0x40000000的調用堆棧。控製程序執行:p, pa,t, ta等命令可以用來控製程序的執行。控制異常和事件處理:Debugger的預設設置是跳過首次異常(first chance expcetion),在二次異常(second chance exception)時中斷程序的執行。sx命令顯示Debugger的設置。sxe和sxd可以改變Debugger的設置。 sxe clr可以控制Debugger在託管異常發生時中斷程序的執行。常用的Debugger事件有: av 訪問異常 eh C++異常 clr 託管異常 ld 模塊載入-c 選項可以用來指定在事件發生時執行的調試命令。
④ 關於vs生成的pdb文件信息
首先,你Release版斷點進去?那還是Release么,有了調試信息和調試編譯,這只能叫做不完全Debug版,不是Release了。
其次,斷點進不去和符號表信息沒什麼關系,如果禁止設置斷點(DEBUG下)應該是編譯信息出現錯誤,刪除中間文件Rebuild All就可以了。如果是斷點無響應,那麼應該是代碼邏輯或者代碼編譯邏輯有誤(編譯模式或者宏分支等問題)