嵌入式除錯技術

2022-05-03 03:18:08 字數 2667 閱讀 6758

嵌入式除錯方法:

1.模擬器。比如qtopia core可以用奇趣提供的frame buffer模擬工具qvfb,arm硬體模擬可以用skyeye開源專案。

2.遠端除錯。偵錯程式還在pc上,偵錯程式與被除錯的程式通過網路通訊。

3.通過log和core dump等檔案事後分析。

stdprm標準印表機lpt1埠

stdaux標準序列裝置com1埠

stdin並不一定來自鍵盤,stdout和stderr也並不一定顯示在螢幕上,可以將它們重定向到其他裝置或磁碟檔案上。

使用fprintf()時,第一引數推薦使用stderr而不要使用stdout,因為stderr的執行級要高一些,程式在異常退出時stderr可以輸出,而stdout就不行。

cmd >file把stdout重定向到file中

cmd >>file把stdout追加到file中

cmd 2>>file 1>&2把stderr追加到file中,再把stdout追加到stderr中

在c程式中通過freopen()進行重定向

file *freopen(const char *filename,const char mode,file *stream)

比如freopen("err.log","w",stderr)就把stderr重定向到err.log檔案了

控制log的級別

比如qt中提供qdebug(),qwarning(),gtk中也有相應的g_debug(),g_error(),核心除錯的printk()也提供很多級別。

在編譯時利用qt提供的巨集qt_no_debug_output就可以將qdebug("var=%d\n",var)去掉了,下次需要時還可以通過重新編譯找回來。

#include#ifndef loglevel_h

#define loglevel_h

#ifndef log_level_critical

#define log_level_critical 0

#endif

#ifndef log_level_error

#define log_level_error 1

#endif

#ifndef log_level_debug

#define log_level_debug 2

#endif

#define default_log_level log_level_critical

#ifndef log_level

#define log_level log_level_default

#endif

#define _print_log(fmt,arg...) \

dowhile(0) \

#if(log_level_critical<=log_level)

#define log_critical(fmt,arg...) _print_log(fmt,##arg)

#else

#define log_critical(fmt,arg...) do{}while(0)

#endif

#if(log_level_error<=log_level)

#define log_error(fmt,arg...) _print_log(fmt,##arg)

#else

#define log_error(fmt,arg...) do{}while(0)

#endif

#if(log_level_degub<=log_level)

#define log_debug(fmt,arg...) _print_log(fmt,##arg)

#else

#define log_debug(fmt,arg...) do{}while(0)

#endif

#endif

注意上面**中用到了乙個gcc提供的可變引數的方法。

#define _print_log(fmt,arg...)	\

dowhile(0) \

c99支援的可變引數巨集如下:
#define _print_log(fmt, ...)
dowhile(0)

之所以用do{}while(0)的格式來定義函式巨集,這是考慮到巨集的巢狀使用等一些情況。

#include "loglvl.h"

int main()

orisun@zcypc:~/docs$ gcc testlvl.c -o testlvl

orisun@zcypc:~/docs$ ./testlvl

testlvl.c:7this is a critical log.

orisun@zcypc:~/docs$ gcc testlvl.c -o testlvl -dlog_level=2

orisun@zcypc:~/docs$ ./testlvl

testlvl.c:5this is a debug log.

testlvl.c:6this is a error log.

testlvl.c:7this is a critical log.

嵌入式Linux除錯技術

嵌入式除錯方法 1.模擬器。比如qtopia core可以用奇趣提供的frame buffer模擬工具qvfb,arm硬體模擬可以用skyeye開源專案。2.遠端除錯。偵錯程式還在pc上,偵錯程式與被除錯的程式通過網路通訊。3.通過log和core dump等檔案事後分析。大多數開發人員認為kgdb...

嵌入式linux除錯技術

android模擬器只能通過埠對映的方式使用kgdbserver除錯程式。但開發板除了可以通過ip連線到kgdbserver外還可以通過串列埠進行連線。開發板同樣也帶了kgdbserver程式,可直接執行。大多數開發人員認為kgdb是最好的核心除錯工具。kgdb除了提供類似的printk函式的日誌輸...

嵌入式Linux的除錯技術

嵌入式linux的除錯技術 對於複雜的linux驅動及程式庫,需要使用各種方法對其進行除錯。如 設定斷點 逐步跟蹤 輸出除錯資訊等。本章將主要介紹如何利用開發板 android模擬器以及一些函式 工具除錯嵌入式linux核心模組 可執行程式和共享庫。列印核心除錯資訊 printk。該函式的用法與pr...