嵌入式開發(fā)基礎(chǔ)調(diào)試篇_第1頁
嵌入式開發(fā)基礎(chǔ)調(diào)試篇_第2頁
嵌入式開發(fā)基礎(chǔ)調(diào)試篇_第3頁
嵌入式開發(fā)基礎(chǔ)調(diào)試篇_第4頁
嵌入式開發(fā)基礎(chǔ)調(diào)試篇_第5頁
已閱讀5頁,還剩12頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

嵌入式開發(fā)基礎(chǔ)調(diào)試篇第1頁,共17頁,2023年,2月20日,星期一memwatch下載memwatch-2.71.tar.gztarzxvfmemwatch-2.71.tar.gzcdmemwatch-2.71編寫源代碼(test.c)增加#include“memwatch.h”編譯gcc-DMEMWATCH–DMW_STDIO test.cmemwatch.c–otest運行./test查看memwatch.log文件第2頁,共17頁,2023年,2月20日,星期一YetAnotherMallocDebugger下載yamd-0.32.tar.gztarzxvfyamd-0.32.tar.gzcdyamd-0.32 make makeinstall編寫源代碼(test.c)編譯./yamd-gcc-g–otesttest.c運行./test查看輸出日志第3頁,共17頁,2023年,2月20日,星期一GDB在編譯時選擇-g選項gdb的啟動

gdbprogram-name orgdb啟動后執(zhí)行fileprogram-name orgdbprogram-namecorefile-name

常用命令:filelistnextsteprunquitwatch breakmakeshellprintdisabledeletecontinue 第4頁,共17頁,2023年,2月20日,星期一KDB準備工作 您將需要下載并應(yīng)用兩個補丁。一個是“公共的”補丁,包含了對通用內(nèi)核代碼的更改,另一個是特定于體系結(jié)構(gòu)的補丁。 例如,在運行2.6.6內(nèi)核的x86機器上,您會需要kdb-v4.3-2.6.6-common-1.bz2和kdb-v4.3-2.6.6-i386-1.bz2第5頁,共17頁,2023年,2月20日,星期一KDB安裝

bzip2-dkdb-v4.3-2.6.6-common-1.bz2 bzip2-dkdb-v4.3-2.6.6-i386-1.bz2打補丁

patch-p1<kdb-v4.3-2.6.6-common-1 patch-p1<kdb-v4.3-2.6.6-i386-1第6頁,共17頁,2023年,2月20日,星期一KDB編譯內(nèi)核“Kernelhacking”部分選擇“Built-inKernelDebuggersupport”選項。選擇“Compilethekernelwithframepointers”選項(如果有的話)則設(shè)置CONFIG_FRAME_POINTER標志。這將產(chǎn)生更好的堆?;厮?,因為幀指針寄存器被用作幀指針而不是通用寄存器。您還可以選擇“KDBoffbydefault”選項。這將設(shè)置CONFIG_KDB_OFF標志,并且在缺省情況下將關(guān)閉KDB。第7頁,共17頁,2023年,2月20日,星期一KDBmakecleanmakemrpropermakemenuconfigmakebzImagemakemodulesmakemodules_install第8頁,共17頁,2023年,2月20日,星期一KDBcpSystem.map/boot/cparch/i386/boot/bzImage/boot/vmlinuz-2.6.6mkinitrdinitrd-2.6.6.img2.6.6配置grubreboot第9頁,共17頁,2023年,2月20日,星期一激活KDB

通過在引導期間將kdb=on(off)標志傳遞給內(nèi)核或者通過在掛裝了/proc之后執(zhí)行該工作:#echo"1">/proc/sys/kernel/kdb (#echo“0">/proc/sys/kernel/kdb)kdb=early標志將導致在引導過程的初始階段就把控制權(quán)傳遞給KDB。如果您需要在引導過程初始階段進行調(diào)試,那么這將有所幫助。啟動:PAUSE鍵第10頁,共17頁,2023年,2月20日,星期一KDB命令

內(nèi)存顯示和修改這一類別中最常用的命令是md、mdr、mm和mmW。md命令以一個地址/符號和行計數(shù)為參數(shù),顯示從該地址開始的line-count行的內(nèi)存。如果沒有指定line-count,那么就使用環(huán)境變量所指定的缺省值。如果沒有指定地址,那么md就從上一次打印的地址繼續(xù)。地址打印在開頭,字符轉(zhuǎn)換打印在結(jié)尾。mdr命令帶有地址/符號以及字節(jié)計數(shù),顯示從指定的地址開始的byte-count字節(jié)數(shù)的初始內(nèi)存內(nèi)容。它本質(zhì)上和md一樣,但是它不顯示起始地址并且不在結(jié)尾顯示字符轉(zhuǎn)換。mdr命令較少使用。mm命令修改內(nèi)存內(nèi)容。它以地址/符號和新內(nèi)容作為參數(shù),用new-contents替換地址處的內(nèi)容。mmW命令更改從地址開始的W個字節(jié)。請注意,mm更改一個機器字。第11頁,共17頁,2023年,2月20日,星期一KDB命令寄存器顯示和修改這一類別中的命令有rd、rm和ef。rd命令(不帶任何參數(shù))顯示處理器寄存器的內(nèi)容。它可以有選擇地帶三個參數(shù)。如果傳遞了c參數(shù),則rd顯示處理器的控制寄存器;如果帶有d參數(shù),那么它就顯示調(diào)試寄存器;如果帶有u參數(shù),則顯示上一次進入內(nèi)核的當前任務(wù)的寄存器組。rm命令修改寄存器的內(nèi)容。它以寄存器名稱和new-contents作為參數(shù),用new-contents修改寄存器。寄存器名稱與特定的體系結(jié)構(gòu)有關(guān)。目前,不能修改控制寄存器。ef命令以一個地址作為參數(shù),它顯示指定地址處的異常幀。顯示通用寄存器組:

rd第12頁,共17頁,2023年,2月20日,星期一KDB命令斷點常用的斷點命令有bp、bc、bd、be和bl。bp命令以一個地址/符號作為參數(shù),它在地址處應(yīng)用斷點。當遇到該斷點時則停止執(zhí)行并將控制權(quán)交予KDB。該命令有幾個有用的變體。bpa命令對SMP系統(tǒng)中的所有處理器應(yīng)用斷點。bph命令強制在支持硬件寄存器的系統(tǒng)上使用它。bpha命令類似于bpa命令,差別在于它強制使用硬件寄存器。bd命令禁用特殊斷點。它接收斷點號作為參數(shù)。該命令不是從斷點表中除去斷點,而只是禁用它。斷點號從0開始,根據(jù)可用性順序分配給斷點。be命令啟用斷點。該命令的參數(shù)也是斷點號。bl命令列出當前的斷點集。它包含了啟用的和禁用的斷點。bc命令從斷點表中除去斷點。它以具體的斷點號或*作為參數(shù),在后一種情況下它將除去所有斷點。第13頁,共17頁,2023年,2月20日,星期一KDB命令堆棧跟蹤主要的堆棧跟蹤命令有bt、btp、btc和bta。bt命令設(shè)法提供有關(guān)當前線程的堆棧的信息。它可以有選擇地將堆棧幀地址作為參數(shù)。如果沒有提供地址,那么它采用當前寄存器來回溯堆棧。否則,它假定所提供的地址是有效的堆棧幀起始地址并設(shè)法進行回溯。如果內(nèi)核編譯期間設(shè)置了CONFIG_FRAME_POINTER選項,那么就用幀指針寄存器來維護堆棧,從而就可以正確地執(zhí)行堆棧回溯。如果沒有設(shè)置CONFIG_FRAME_POINTER,那么bt命令可能會產(chǎn)生錯誤的結(jié)果。btp命令將進程標識作為參數(shù),并對這個特定進程進行堆?;厮?。btc命令對每個活動CPU上正在運行的進程執(zhí)行堆?;厮?。它從第一個活動CPU開始執(zhí)行bt,然后切換到下一個活動CPU,以此類推。bta命令對處于某種特定狀態(tài)的所有進程執(zhí)行回溯。若不帶任何參數(shù),它就對所有進程執(zhí)行回溯??梢杂羞x擇地將各種參數(shù)傳遞給該命令。將根據(jù)參數(shù)處理處于特定狀態(tài)的進程。選項以及相應(yīng)的狀態(tài)如下:D:不可中斷狀態(tài)。R:正運。S:可中斷休眠。T:已跟蹤或已停止Z:僵死。U:不可運行。這類命令中的每一個都會打印出一大堆信息。第14頁,共17頁,2023年,2月20日,星期一KDB命令下面是在內(nèi)核調(diào)試過程中非常有用的其它幾個KDB命令。id命令以一個地址/符號作為參數(shù),它對從該地址開始的指令進行反匯編。環(huán)境變量IDCOUNT確定要顯示多少行輸出。ss命令單步執(zhí)行指令然后將控制返回給KDB。該指令的一個變體是ssb,它執(zhí)行從當前指令指針地址開始的指令(在屏幕上打印指令),直到它遇到將引起分支轉(zhuǎn)移的指令為止。分支轉(zhuǎn)移指令的典型示例有call、return和jump。go命令讓系統(tǒng)繼續(xù)正常執(zhí)行。一直執(zhí)行到遇到斷點為止(如果已應(yīng)用了一個斷點的話)。reboot命令立刻重新引導系統(tǒng)。它并沒有徹底關(guān)閉系統(tǒng),因此結(jié)果是不可預測的。ll命令以地址、偏移量和另一個KDB命令作為參數(shù)。它對鏈表中的每個元素反復執(zhí)行作為參數(shù)的這個命令。所執(zhí)行的命令以列表中當前元素的地址作為參數(shù)。第15頁,共17頁,2023年,2月20日,星期一KDB命令舉例假設(shè)我們的程序源文件名為getpid.c,內(nèi)容是:#include<syscall.h>#include<unistd.h>#include<stdio.h>#include<sys/types.h>intmain(void){longID;ID=getpid();printf("getpid()=%ld\n",ID);return(0);}第16頁,共17頁,2023年,2月20日,星期一KDB命令舉例將其編譯成名為getpid的執(zhí)行文件”gcc–ogetpid<路徑>/getpid.c”,我們使用KDB來產(chǎn)看它進入內(nèi)核后的執(zhí)行路徑。激活KDB(按下pause鍵,當然你必須已經(jīng)給內(nèi)核打了KDB補丁);設(shè)置內(nèi)核斷點“bpsys_getpid”;退出kdb“go”;然后執(zhí)行./getpid。瞬間,進入內(nèi)核調(diào)試狀態(tài),執(zhí)行路徑停止在斷點sys_getpid處。在KDB>提示符下,執(zhí)行bt命令觀察堆棧,發(fā)現(xiàn)調(diào)用的嵌套路徑,可以看到在sys_ge

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論