日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

第十章 嵌入式Linux的调试技术

發布時間:2023/12/4 综合教程 32 生活家
生活随笔 收集整理的這篇文章主要介紹了 第十章 嵌入式Linux的调试技术 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、打印內核調試信息:printk

  Printk函數用法與printf函數類似,只不過printk函數運行在內核空間,printf函數運行在用戶空間,printk函數在printk.c文件中實現。

  Printk函數的原型如下:asmlinkage int printk(const char *fmt,...)

二、防止printk函數降低Linux驅動性能

  雖然使用printk函數可以很方便地將消息寫入日志文件或控制臺。但大量使用printk函數頻繁操作日志問阿金或控制臺設備文件會嚴重影響Linux驅動的性能。因此,這就要求Linux驅動只在開發階段使用printk函數輸出消息,在正式發布Linux驅動時將可能影響性能的printk函數去掉。最好的方法無疑是利用C語言中的編譯指令。(#if、#else、#endif等)。

  如果不想使用printk輸出消息,只要將#if中的1改為0即可不使用printk輸出消息。

三、通過虛擬文件系統(/pron)進行數據交互

  /pron用來作為內核空間與用戶空間進行數據交互的工具,它的文件系統的行為凡是與設備文件系統(/dev)類似。/pron是虛擬文件系統,是內存映射,所有讀寫/pron的操縱都是對內存的讀寫,因此,它也可以作為Linux驅動與用戶空間程序交互的工具。

  /pron 文件系統主要通過proc_dir_entry.read_proc和proc_dir_entry.read_write函數指針來設置讀寫/pron目錄中的虛擬文件的動作處理函數,proc_dir_entry結構體代表一個虛擬目錄或文件

四、Linux中提供的一類工具:通過這些工具可以逐行跟蹤程序的代碼,用于測試用戶空間程序的gdb、gdbserver和調試內核空間程序的kgdb。

1、用gdb調試用戶空間程序:gdb可跟蹤調試用戶空間的程序,這些調試命令可用于gdbserver遠程調試。可直接運行腳本文件編譯gdb_debug.c,但要加上命令行參數-g。使用命令“# gdb gdb_debug”調試gdb_debug。

  最簡單的命令:quit,用于退出gdb調試界面。

  常用的調試命令,如下:

  ①list:用于列出程序中的代碼。

    list命令有3種調用格式:

    (1)list:顯示上一次調用list命令輸出的最后一行后面的10行,第一次調用list命令會顯示程序開頭的10行。

    (2)list -:顯示上一次調用list命令輸出的第一行前面的10行,第一次調用list命令什么都不會顯示。

    (3)list n:顯示第n行附近的10行,一般會顯示第n行前面5行和后面4行,加上第n行,正好10行,如果前面或后面的行數不足,則只顯示實際的行。

  ②break n:將指定行設置為斷點,n表示行號;

  ③clear n:清除指定行的斷點;

  ④tbreak n:將指定行設置為斷點,斷點只能使用一次,使用完后自動清除;

  ⑤run:運行程序,在run后面可跟命令行參數。這些參數值會傳給正在調試的程序;

  ⑥cont/continue:跳過當前斷點繼續執行,該命令有兩種格式:(1)cont:跳過當前斷點繼續執行(2)cont n:跳過n次斷點繼續執行;

  ⑦next:繼續執行下面的語句,但跳過這程序,相當于step over

2、用gdbserver遠程調用用戶空間程序:gdbserver是一個可運行在ARM架構上的服務端程序,即在開發板上使用gdbserver打開要測試的程序,然后通過串口、有線或無線網絡可在PC上進行調試。

開發板和Android模擬器都帶了gdbserver程序,運行腳本文件可將之前編寫的gdb_debug程序上傳到Android模擬器。

  1)、先進入模擬器終端,進入/data/local目錄,執行命令“# gdbserver :4321 ./gdb_debug”啟動gdbserver監聽程序,使用本機的4321端口號進行監聽。

  2)、再開啟一個Linux終端,使用命令“# adb -s emulator-5554 forward tcp:4321 tcp:4321”將外部訪問模擬器的4321端口的數據包轉發到Android模擬器內部的4321    端口。使用telnet命令也可映射端口,執行命令“# telnet localhost 5554”進入telnet。

  3)、進入之后,使用命令“# redir add tcp:4321:4321”映射端口。

4)、映射完端口后,在Linux終端執行命令“# arm-none-linux-gnueabi-gdb gdb_debug”進入gdb控制臺。

5)、執行上面命令進入gdb控制臺,然后執行命令“(gdb) target remote localhost:4321”連接Android模擬器。

Android模擬器只能通過端口映射方式使用gdbserver調試程序,但開發板除了可通過IP連接到gdbserver外,還可通過串口進行連接,開發板同樣帶了gdbserver程序,可直接運行。開發板和Android模擬器使用gdbserver調試程序的過程類似,只是gdbserver和target remote命令的命令行參數不同。通過IP方式連接開發板上的gdbserver,還需在開發板上執行命令“# gdbserver localhost:4321 ./gdb_debug”。在Linux終端的gdb控制臺需執行命令“(gdb) target remote 192.168.17.103 ./gdb_debug”連接開發板的gdbserver,192.168.17.103是開發板的IP,開發板不需要進行端口映射。通過串口連接開發板的gdbserver,在開發板需執行命令“# gdbserver /dev/s3c2410_serial10 ./gdb_debug”,/dev/s3c2410_serial10是開發板上串口的設備文件。在Linux終端的gdb控制臺需要執行命令“(gdb) target remote /dev/ttyUSB0”連接開發板的gdbserver,/dev/ttyUSB0是串口轉USB口的設備文件。若直接使用串口線,設備文件可能是/dev/ttyS1。

3、用kgdb遠程調試內核程序:kgdb除了提供類似printk函數的日志輸出功能,還允許開發人員直接在PC上通過GDB鏈接目標設備。

kgdb包含兩部分:kgdb內核和一套連接接口。這些接口目前支持串口tty設備連接和以太網連接。其中串口連接需要通過內核參數kgdbboc指定要連接的串口設備,以太網連接通過內核參數kgdbboc指定IP和端口號。kgdb支持多種處理器架構,單獨為每個支持的處理器架構實現了kgdb內核。要用kgdb調試Linux內核,首先需配置Linux內核。使用make menuconfig進入Linux內核的配置菜單,進入“Kernel hacking”,找到并選中“KGDB:kernel debugger”。配置內核參數,這些參數通知Linux內核如何進行測試。設置完啟動參數后,主機就可使用gdb命令調試Linux內核,執行命令“# gdb ./vmlinux”,還可設置傳輸速率和連接要調試的Linux內核,最后就是使用gdb命令進行Linux內核調試。當發現某段代碼的bug太多或很難通過printk函數輸出信息找出,可考慮使用kgdb逐步的方式定位bug。

http://home.cnblogs.com/u/ligang1307/

總結

以上是生活随笔為你收集整理的第十章 嵌入式Linux的调试技术的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。