彙編環境下的原始碼除錯

看雪資料發表於2002-09-20

Author:Hume[Afo]/冷雨飄心
(本文針對MASM32開發環境而寫,本文例子下載:http://www.miecn.com/bbs/usr/10/10_685_7.zip)
===================================================
對AF(asm fans)來說,程式中潛在的未知錯誤是不可避免的也是最頭痛的事情之一.如何在ASM環境下除錯程式成了整個環節中耗時很多的工作.

許多其它編譯器都附帶了原始碼級的偵錯程式,VC,TC大家都不會陌生,這使得用這些高階語言除錯成了一件相對easy的事情,你可以迅速進入事故現場並排除之.ASM不同,微軟並沒有為他提供一個整合的開發和除錯環境,我們一切都得自己來!

好在我們有強大的SoftIce,這使得彙編下的除錯工作變得簡單,關於SICE下的原始碼除錯於很多文章,後面將附上羅雲彬羅老的一篇介紹文章,在附帶的例子裡將提供Sice除錯的具體例項,你要作的是修改 \hd目錄下的debug.bat的內容使其指向你機器上的SICE路徑,然後執行dbg.bat檔案,then ok,Go!

一、TRW下的原始碼除錯的實現

除錯的另一個選擇是使用trw2000,他同樣支援原始碼除錯.具體如何操作呢,

下載DBGLOAD外掛使tr支援Coff符號除錯.可從TRW的主頁下載,不贅述.

首先編寫一個目標程式,如win,顯示一個視窗並帶有一個選單,選單隻有一項,即EXIT,在編譯時開啟ml的Zi選項,產生除錯符號,如:

ml /c /coff /Zi win.asm

link開啟兩個選項:/DEBUG 和/DEBUGTYPE:CV(同時便於用SICE除錯)

Link /SUBSYSTEM:WINDOWS /DEBUG /DEBUGTYPE:CV [/MAP:win.map] win.obj res\wnd.res

呵呵,用trw2K 直接Load win.exe,trw會自動載入.pdg檔案和原始檔,用src調整原始碼狀態,終於我們在trw下也實現了原始碼級除錯,酷吧!

注:/MAP:win.map可不選,這裡主要是為了說明下面的符號除錯

附:關於mapsym的符號除錯

下面用Mapsym轉化.map-->.sym

mapsym.exe -ms win.map

MAPSYM是用來把連結產生的.map檔案轉化為tr可用的.sym檔案.引數格式如下:

Usage: -> Mapsym [-nologo] [-almnst] [-c pefile] -o outfile] infile

-a include alphebatic sort arrays
-l list map file information
-e edit symbols for NTSD parser
-m use module name from infile
-n omit line number information
-nologo omit signon logo
-o outfile symbol outputfile
-s enable line number support [default]
-t include static symbols


這個檔案在DDK裡,如果你沒有DDK可在我主頁軟體資源找到下載,例子裡面已經內含.



按照trw的說明書如果包含行號的話,應該可以載入原檔案而實現原始碼除錯,可惜試驗未能成功,只能進行符號除錯,哪位成功請指點一二.



附:二、SoftIce下的原始碼除錯的實現 (Author:羅雲彬)
在 Windows 程式設計中,Soft-ICE 是一件必不可少的除錯工具,但 Windows 程式的程式設計中有很多的時候是和資料結構和 API 打交道,經過編譯以後,原來的 mov stRect.left,eax 之類的程式碼也就變成了 mov [xxxx],eax,invoke UpdateWindow,hWnd 之類的語句也就變成了 push [xxxx]/call [xxxxx] 之類的語句,如果你不記的源程式了,你就根本無法知道你在向什麼資料寫或者呼叫什麼 API,在 C++ 程式設計的時候,我們都可以進行原始碼級別的跟蹤除錯,但在彙編中,這可能嗎?


答案是可以的,用 Soft-ICE 就可以實現,本文討論使用 Masm 的情況下用 Soft-ICE 實現原始碼除錯,具體的實現如下:

首先,在編譯的時候要生成帶符號資訊的 Object 檔案,這需要開啟 ML 程式的兩個選項
ML /coff /Zi ...
/coff 告訴編譯器產生符號除錯格式的 Object 檔案。
/Zi 使 Object 檔案中包括符號除錯資訊。
然後也要設定 Link 檔案,因為 Soft-ICE 使用 CodeView 格式的除錯資訊,所以 Link 也要包括下面的選項
Link /DEBUG /DEBUGTYPE:CV ...
/DEBUG 選項告訴 Link 在 exe 檔案中包含除錯資訊。
/DEBUGTYPE:CV 當然是除錯資訊要用 CodeView 格式啦。
最後,就是如何使用 Soft-ICE 了,如果要使用符號除錯功能,你不能再用 Loader32.exe 程式來裝入 exe 檔案,而是必須用符號轉換程式 nmsym,使用方法是在命令列中打入 nmsym /translate:source,package,always /source:. /load:execute,break 你的exe檔案,你可以把它編寫成一個 bat 檔案如下 nmsym /translate:source,package,always /source:. /load:execute,break %1,假定檔名為 debug.bat ,然後你就可以用 debug xxx.exe 來享受原始碼除錯的樂趣了。
別的一些必要的設定:你必須把 Soft-ICE 的目錄和 Masm 的 bin 目錄設定到 path 中,因為這些路徑中還有些檔案要用到。

相關文章