新聞中心
在Linux系統(tǒng)開發(fā)的過程中,難免會遇到一些問題,如應用程序的崩潰、內核崩潰等等。這時候,開啟Debug模式可以幫助我們定位問題。本篇文章將會介紹如何在Linux下啟用Debug模式進行調試。

成都創(chuàng)新互聯(lián)是專業(yè)的湟源網站建設公司,湟源接單;提供成都做網站、網站制作、成都外貿網站建設,網頁設計,網站設計,建網站,PHP網站建設等專業(yè)做網站服務;采用PHP框架,可快速的進行湟源網站開發(fā)網頁制作和功能擴展;專業(yè)做搜索引擎喜愛的網站,專業(yè)的做網站團隊,希望更多企業(yè)前來合作!
一、為什么需要Debug模式?
我們都知道,在大型的軟件開發(fā)項目中,為了提高開發(fā)效率和編寫質量,一般都會采用模塊化開發(fā)。但是,這樣做也會帶來一些問題。例如,一個模塊的代碼里出現(xiàn)了問題,我們并不知道問題的具置和原因,這時候就需要Debug模式進行調試。Debug模式可以讓我們看到每一個變量、函數(shù)和程序執(zhí)行流程,從而能夠準確找到問題。
二、Linux下的Debug模式
Linux和其他操作系統(tǒng)一樣,內部都包含了一些調試工具。與Windows下的Visual Studio不同,Linux下的Debug工具分散在各種軟件包里,有些工具需要自行編譯安裝。在使用Linux進行開發(fā)時,我們需要了解以下幾方面的知識:
1.開啟Debug信息
將Debug信息包含在可執(zhí)行文件中,可以查看每個函數(shù)的調用情況,同時提供了一些有助于定位問題的信息。在編譯時開啟Debug選項,即使用gcc或者其他的編譯器,在命令行中添加“-g”參數(shù)。例如:
$ gcc -g myapp.c -o myapp
這樣就可以將Debug信息包含在可執(zhí)行文件myapp中了。
2.調試器
Linux下有很多調試器可供選擇,例如gdb、kdb、strace、ltrace等等。其中最常用的是gdb調試器。我們可以在開發(fā)過程中,利用gdb調試器來監(jiān)視進程的運行情況,并在程序發(fā)生錯誤時進行定位。例如:
$ gdb myapp
在進入gdb后,我們可以使用一系列命令嘗試查找問題。
3.內核調試
內核調試通常是在出現(xiàn)內核崩潰或掛起時進行的??梢允褂脙群说膋db或kgdb工具進行調試。若我們想在內核調試中使用gdb調試器,就需要使用kgdb。底下將以kgdb為例,介紹Linux內核的調試過程:
(1)安裝kgdb插件
$ sudo apt-get install linux-image-$(uname -r)-dbg
(2)將內核信息打印到控制臺
使用echo命令將一個變量的值輸出到系統(tǒng)日志中,這樣在調試時,可以看到這條語句被執(zhí)行后變量的取值。
$ echo 1 > /proc/sys/kernel/printk
(3)準備好調試環(huán)境
重啟系統(tǒng)時,在grub初始界面按下“e”鍵,進入編輯模式,在啟動默認的kernel時,加上“kgdbwt kgdboc=ttyS0,115200”,保存后啟動。這時候,在設備管理器中可以看到一個ttyS0的串口,即可在連接該串口時使用gdb進行調試。
三、針對不同的問題使用不同的調試工具
目前我們介紹了gdb、kdb、strace、ltrace等調試工具,這些工具各自有其優(yōu)缺點,使用場景也不同。下面分別介紹它們的使用場景:
1.gdb
gdb是最常用的調試器,其主要優(yōu)點是強大和高效,它可以針對不同的問題,在調試時提供不同的工具。例如,針對崩潰問題,可以使用Core文件調試;針對CPU過高問題,可以使用Profiling調試;針對內存泄漏問題,可以使用Valgrind調試等。gdb還提供了許多非常有用的命令,例如“bt”查看調用棧、“watch”監(jiān)視變量值等等。
2.kdb
kdb是Linux內核的調試工具,它內嵌在內核中,可以在內核崩潰或掛起時使用。kdb的優(yōu)點在于它可以直接操作內核,可以更加方便快捷地定位問題。同時,使用kdb時,只需要通過常規(guī)串口進行操作,與使用gdb時,需要連接調試卡相比,操作簡單方便。
3.strace
strace是一種跟蹤應用程序的系統(tǒng)調用的工具。它可以顯示應用程序運行時和系統(tǒng)交互的細節(jié)。strace的主要優(yōu)點在于它可以跟蹤應用程序在運行時發(fā)生的事件,例如文件I/O,進程創(chuàng)建,網絡操作等等。使用strace可以幫助我們找到應用程序在運行時出現(xiàn)的錯誤。
4.ltrace
ltrace也是一種跟蹤應用程序的工具,但是不同于strace,ltrace的主要目標是跟蹤應用程序使用的庫函數(shù)。與strace相比,ltrace輸出的信息更為具體,可以讓我們更輕松地找到問題。
四、
本文介紹了Linux下的Debug模式,以及如何啟用Debug模式進行調試。在實際開發(fā)中,我們需要針對不同的問題,使用不同的Debug工具。通過深入學習和了解這些工具的使用,可以幫助我們更快速、更準確地找到問題,提高代碼質量和開發(fā)效率。
相關問題拓展閱讀:
- 如何在Android 或Linux 下,做Suspend /Resume 的Debug
- 嵌入式linux怎么檢內存泄漏雨
- 如何打開linux下apache tomcat 的debug端口 (轉)
如何在Android 或Linux 下,做Suspend /Resume 的Debug
在Linux或Android下,做power management 的調適時,常遇到沒有足夠的information,可以做為debug時的依據(jù)和參考
我們整理了幾個常用的參數(shù)或Command,可供設計者,得到足夠的Informaiton 做Suspend / Resume的function Debug。
加boot 參數(shù) no_console_suspend
基本上我們常常使用console做為suspend function的debug的Information source,但原始的source code在suspend過程中,會將console關掉。所以我們擾鋒看到一定程度後就再也看不到message了。
但是我們并不知道在Suspend的過程中老李配,系統(tǒng)到底發(fā)生了什麼事,可能造成無法suspend。
為此,我們就會在kernel 啟動參數(shù)中加上no_console_suspend這個參數(shù)。在AM/DM37x APM中是修改boot.scr檔案參數(shù)
#!/bin/sh
cat boot.cmd
if fatload mmcuImage
then
echo ***** Kernel: /dev/mmcblk0p1/uImage *****
fi
echo ***** RootFS: /dev/mmcblk0p2 *****
# Pantherboard DVI output
#setenv bootargs ‘console=ttyO2,115200n8 androidboot.console=ttyO2 mem=512M root=/dev/mmcblk0p2 rw rootfstype=ext3 rootdelay=1 init=/init ip=off omap_vout.vid1_static_vrfb_alloc=y omapdss.def_disp=dvi vram=32M omapfb.mode=dvi:1280x720MR-32 omapfb.vram=0:16M mpurate=1000’
# Pantherboard LCD output
setenv bootargs ‘console=ttyO2,115200n8 androidboot.console=ttyO2 mem=512M root=/dev/mmcblk0p2 rw rootfstype=ext3 rootdelay=1 init=/init ip=off omap_vout.vid1_static_vrfb_alloc=y omapdss.def_disp=lcd omapfb.mode=lcd:800x480MR-32 vram=8M omapfb.vram=0:8M mpurate=1000’
將no_console_suspend加上去到boot 參數(shù)後就好了
setenv bootargs ‘console=ttyO2,115200n8 androidboot.console=ttyO2 mem=512M root=/dev/mmcblk0p2 rw rootfstype=ext3 rootdelay=1 init=/init ip=off omap_vout.vid1_static_vrfb_alloc=y omapdss.def_disp=lcd omapfb.mode=lcd:800x480MR-32 vram=8M omapfb.vram=0:8M mpurate=1000 no_console_suspend’
如果是OMAP4 APM的話,請修改Kernel 參數(shù)的所在檔案即可(在U-boot Source code中)
這個是基本的參數(shù),所以在Android或Linux上都可以使用。 kernel把console suspend掉侍指以後, 不管里面出了什麼事情, 在Console上都看不到。 而使用這個參數(shù)後,大部分在suspend/resume時候的死機都可以通過Console看到kernel Panic的信息, 這樣我們才會知道是哪里出了問題。 因為有的時候resume出錯, 或者suspend到很後面出錯的console不加這個參數(shù)都看不到。
但這個參數(shù)在TI OMAP3/OMAP4/AM37x/DM37x有可能造成有時Suspend 完當?shù)艋蚴莚esume 失敗的問題,假如已經抓到問題在那的時候,您就可以將這個參數(shù)Disable,不然很可能就會Debug不下去。
initcall_debug
這個同樣kernel參數(shù),使用的時機是,當我們不知道是那個driver在suspend/resume過程中出錯的時候,可以使用這個參數(shù)來找出問題所在。在下完這個參數(shù)後,Kernel在suspend時,會將每個driver或task的狀況report出來。我們可以藉由這些information,Check 在suspend時,每個task和driver是否已經完成進suspend 的相關準備工作…
打開這個參數(shù)的方法有二種
一種是在console下Command,啟動這個function…
echo 1 > /sys/module/kernel/parameters/initcall_debug
echo 9 > /proc/sys/kernel/printk
其中上面的之一條命令是打開initcall_debug, 這個是所有的kernel都會有的。
而第二條命令是要提高kernel message 級別,因為initcall的這些信息都是KERN_DEBUG級別的, 所以需要提高printk的級別才可以看到, 要不然suspend/resume的時候掛了,你就沒有機會看到這些信息了。
另一種啟動方法是寫在kernel的啟動參數(shù)下,就可以了。
setenv bootargs ‘console=ttyO2,115200n8 androidboot.console=ttyO2 mem=512M root=/dev/mmcblk0p2 rw rootfstype=ext3 rootdelay=1 init=/init ip=off omap_vout.vid1_static_vrfb_alloc=y omapdss.def_disp=lcd omapfb.mode=lcd:800x480MR-32 vram=8M omapfb.vram=0:8M mpurate=1000 initcall_debug no_console_suspend’
同樣的,這個參數(shù)也有可能造成AM37x/DM37x/OMAP4 APM發(fā)生進suspend當?shù)舻膯栴}。所以一旦知道問題所在,麻煩請將這個參數(shù)Disable掉。
suspend_test
這個方法可以用rtc這種軟件的方式來做循環(huán)的suspend/resume, 盡管對於Android這樣并不是很足夠, (還要再模擬一個POWER_KEY上去才夠), 但是對於測試Driver的穩(wěn)定性, 還是有一定用處的。不要認為suspend了幾次可以,那麼就可以通過幾千次的測試。這個suspend是5秒鐘用RTC喚醒,然後回到Android後5秒鐘又會自動睡下去,但是對於通用Linux,你可以寫個script來讓他起來一會再睡下去,或許這個工具比較有用rtcwakeup(google rtcwakeup)。
使用方法:
編譯一個有這個功能的kernel, make menuconfig 以後選上
CONFIG_PM_DEBUG=y
CONFIG_PM_TEST_SUSPEND=y
這兩個選項,燒寫新的kernel,然後打開你需要測試的Device, 比如WIFI,3G
echo “core” > /sys/power/pm_test
echo “mem” > /sys/power/state
這樣, 它就會循環(huán)休眠和喚醒了。
wakelock
Android和Linux在Power Management相關的更大的就是wakelock機制的有無。Android有時候會碰到suspend進不去,或者suspend到最後又莫名奇妙的wake up的問題。這些都有可能是wakelock引起的,或者說是wakelock的使用者引起的。怎麼fine tune呢,使用Console在Android 系統(tǒng)下設定:
echo 15 > /sys/module/wakelock/parameters/debug_mask
echo 15 > /sys/module/userwakelock/parameters/debug_mask
15是代表16進制的F, 在wakelock里面就是把所有的debug信息打開, 起碼現(xiàn)在是這樣設定的。如果以後不夠用了,可能就會改成255.
這樣你能看到kernel和frameworks層對於wakelock的操作、申請及釋放。這樣看申請和釋放成對否就可以了。
注意: wakelock有一種是timeout的,就是說多少毫秒以後,會自動釋放,對於這些wakelock,申請和釋放可能是不成對的。
power.0
有時看到系統(tǒng)suspend到了最後, 然後遇到power.0後suspend失敗,然後整個系統(tǒng)又resume回來。這個是android專有的,因為power.0是android注冊到suspend最後的一個行程, 它會在CPU進入suspend之前檢查一下有沒有wakelock存在, 如果這時候還有沒有釋放的wakelock, 那麼它會return -EBUSY然後導致整個suspend失敗。 Check這個問題的方法就是把上面wakelock的debug信息打開,然後看看是哪個去申請了wakelock,然後Release它。
這個錯誤的錯誤信息大概是這樣的:
pm_noirq_op(): platform_pm_suspend_noirq+0x0/0x38 returns -11
PM: Device power.0 failed to suspend late: error -11
earlysuspend
在android里面中另外一個和Power Management有相關的機制叫earlysuspend, 同樣可以打開debug message,用來做Android earlysuspend debug之用:
echo 15 > /sys/module/earlysuspend/parameters/debug_mask
來把相關的debug信息印出來, 例如那個earlysuspend要被call之類的。
suspend/resume 時間 fine tune
有的時候你要調試suspend/resume的時間太慢的問題。 一種方法是用initcall_debug, 然後把printk的時間戳打上, 然後看那個process最慢,再來Check原因是什麼
我有一個patch,專門用來調試這個問題的,但是upstream不接受, 說非要用這種折磨人的方法才行, 但是如果你想用可以下下來打上去用一下。
地址在這里:
用法是, 打上這個PATCH以後, 在KERNEL里面選擇上PM_DEBUG, SUSPEND_DEVICE_TIME_DEBUG 這兩個選項。
然後
echo
微秒
> /sys/power/device_suspend_time_threshold
比如
echo> /sys/power/device_suspend_time_threshold
注意這里是微秒哦。 。 。 它會把在suspend/resume的時候慢的那些driver打出來,然後你去干掉它。 。
嵌入式linux怎么檢內存泄漏雨
檢測內存泄露主要有以下5種方法:
1、在需要內存泄漏檢查的代碼的開始調用void mtrace(void) (該函數(shù)在頭文件mcheck.h中有聲明)。mtrace為malloc等函數(shù)安裝hook,用于記錄內鄭返存分配信息.在需要內存泄漏檢查的代碼的結束調用void muntrace(void)。
注意: 一般情況下不要調用muntrace, 而讓程序自高叢游然結束. 因為可能有些釋放內存代碼要到muntrace之后才運行.
2、用debug模式編譯被檢查代碼(-g或-ggdb)。
3、設置環(huán)境變量MALLOC_TRACE為一文件名, 這一文件將存有內存分配信戚銷息。
4、運行被檢查程序, 直至結束或muntrace被調用。
5、用mtrace命令解析內存分配Log文件($MALLOC_TRACE)
(mtrace foo $MALLOC_TRACE, where foo is the executible name)
如果有內存泄漏,mtrace會輸出分配泄漏
內存的代碼位置,以及分配數(shù)量。
如何打開linux下apache tomcat 的debug端口 (轉)
修改apache tomcat的bin目錄下的文件catalina.sh在java_opts中增加:JAVA_OPTS=”$JAVA_OPTS -server -Xdebug -Xnoagent -Djavpiler=NONE -Xrunjdwp:transport=dt_socket,address=4050,server=y,suspend=n” 重新啟動apache tomcat即可1、以下為apache學習:apache啟動時報:Syntax error on line 90 Invalid command ‘Order’, perhaps mis-spelled or defined by a module not included in the server configuration,apache無法啟動如何處理其原因是apache權限相關的module沒有加載,導致其不認識Order這個命令,解決方案:在httpd.conf中添加LoadModule access_module /usr/alibaba/httpd/modules/mod_access.so2、這個錯誤時由改棗于共享內存被占用引起的,解決的方式是,先用ipcs命令獲取Shared Memory Segments的shmid,然后使用ipcrm -m $shmid 的方式升殲沒將共享內存釋放3、如何查吵納看當前應用的apache端口號是否被占用netstat -nlp |grep 端口號,可以查看當前端口號是否被占用。
linux 怎么用debug模式的介紹就聊到這里吧,感謝你花時間閱讀本站內容,更多關于linux 怎么用debug模式,Linux如何啟用Debug模式進行調試?,如何在Android 或Linux 下,做Suspend /Resume 的Debug,嵌入式linux怎么檢內存泄漏雨,如何打開linux下apache tomcat 的debug端口 (轉)的信息別忘了在本站進行查找喔。
香港服務器選創(chuàng)新互聯(lián),2H2G首月10元開通。
創(chuàng)新互聯(lián)(www.cdcxhl.com)互聯(lián)網服務提供商,擁有超過10年的服務器租用、服務器托管、云服務器、虛擬主機、網站系統(tǒng)開發(fā)經驗。專業(yè)提供云主機、虛擬主機、域名注冊、VPS主機、云服務器、香港云服務器、免備案服務器等。
網頁標題:Linux如何啟用Debug模式進行調試?(linux怎么用debug模式)
網頁地址:http://fisionsoft.com.cn/article/djdiisg.html


咨詢
建站咨詢
