精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

printf調試的技巧

lilihe92 ? 來源:嵌入式Linux ? 2023-05-10 09:31 ? 次閱讀

1

前言

printf調試是嵌入式調試的基本手段,而且是非常重要的手段,我認為相比單步調試更加有用有效,特別是單片機之后跑系統,單步調試效率更加低下了,我們在工作遇到bug的時候,我們第一時間就想知道那些該死的日志有沒有保存下來,這樣好讓我們程序員裝逼一波把問題解決。

printf宏定義調試非常重要,有些日志在開發的時候才需要打開,發布的時候需要關閉,但是在代碼上又需要保留下次調試,所以我們在調試的時候才打開調試宏定義,而且printf會占用空間,很多芯片的空間非常有限,更應該關閉調試宏。

下面就直接進入正題,說一下調試的技巧

2

正文

1、 編譯器內置宏

先介紹幾個編譯器內置的宏定義,這些宏定義不僅可以幫助我們完成跨平臺的源碼編寫,靈活使用也可以巧妙地幫我們輸出非常有用的調試信息

ANSI C標準中有幾個標準預定義宏(也是常用的):

__LINE__:在源代碼中插入當前源代碼行號;

__FILE__:在源文件中插入當前源文件名;

__DATE__:在源文件中插入當前的編譯日期

__TIME__:在源文件中插入當前編譯時間;

__STDC__:當要求程序嚴格遵循ANSI C標準時該標識被賦值為1;

__cplusplus:當編寫C++程序時該標識符被定義。

編譯器在進行源碼編譯的時候,會自動將這些宏替換為相應內容。

2、最基本的用法

打開宏的時候輸出

09f9e1b8-ee7a-11ed-90ce-dac502259ad0.png

關閉宏的時候輸出

0a0cc72e-ee7a-11ed-90ce-dac502259ad0.png

3、換個高級的用法

代碼如下

#include

#define__DEBUG__

#ifdef__DEBUG__
#defineDEBUG(format,...)printf("Date:"__DATE__",File:"__FILE__",Line:%05d:"format"
",__LINE__,##__VA_ARGS__)
#else
#defineDEBUG(format,...)
#endif

intmain(intargc,char**argv){
charstr[]="HelloWorld";
DEBUG("%s",str);
return0;
}

輸出如下

Date:Oct52018,File:/code/main.c,Line:00013:HelloWorld
sandbox>exitedwithstatus0

在線編譯器網址:https://tool.lu/coderunner/

4、## __VA_ARGS__ ... 宏和可變參數

在GNU C中,宏可以接受可變數目的參數,就象函數一樣

例如:

#definepr_debug(fmt,arg...)
printk(KERN_DEBUGfmt,##arg)

用可變參數宏(variadic macros)傳遞可變參數表
你可能很熟悉在函數中使用可變參數表,如:

voidprintf(constchar*format,...);

直到最近,可變參數表還是只能應用在真正的函數中,不能使用在宏中。

C99編譯器標準允許你可以定義可變參數宏(variadic macros),這樣你就可以

使用擁有可以變化的參數表的宏??勺儏岛昃拖裣旅孢@個樣子:

#definedebug(...)printf(__VA_ARGS__)

缺省號代表一個可以變化的參數表。使用保留名 __VA_ARGS__ 把參數傳遞給宏。

當宏的調用展開時,實際的參數就傳遞給 printf()了

例如:

debug("Y=%d
",y);

處理器會把宏的調用替換成:

printf("Y=%d
",y);

因為debug()是一個可變參數宏,你能在每一次調用中傳遞不同數目的參數:

debug("test");//一個參數

用GCC和C99的可變參數宏, 更方便地打印調試信息

可變參數宏不被ANSI/ISO C++ 所正式支持。因此,你應當檢查你的編譯器,看它是否支持這項技術。

可變參數的宏里的'##'操作說明帶有可變參數的宏(Macros with a Variable Number of Arguments)

5、舉個栗子-Linux內核調試宏

下面是Android touchscreen驅動的調試宏用法,看這樣的寫法就是一個大神了,給大家借鑒。

//Logdefine
#defineGTP_ERROR(fmt,arg...)printk("<<-GTP-ERROR->>"fmt"
",##arg)
#ifDEBUG_SWITCH
#defineGTP_INFO(fmt,arg...)printk("<<-GTP-INFO->>"fmt"
",##arg)
#defineGTP_DEBUG(fmt,arg...)do{
if(GTP_DEBUG_ON)
printk("<<-GTP-DEBUG->>[%d]"fmt"
",__LINE__,##arg);
}while(0)
#defineGTP_DEBUG_ARRAY(array,num)do{
s32i;
u8*a=array;
if(GTP_DEBUG_ARRAY_ON)
{
printk("<<-GTP-DEBUG-ARRAY->>
");
for(i=0;i>Func:%s@Line:%d
",__func__,__LINE__);
}while(0)

#else
#defineGTP_INFO(fmt,arg...)
#defineGTP_DEBUG(fmt,arg...)
#defineGTP_DEBUG_ARRAY(array,num)
#defineGTP_DEBUG_FUNC()
#endif





審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 編譯器
    +關注

    關注

    1

    文章

    1618

    瀏覽量

    49051
  • GNU
    GNU
    +關注

    關注

    0

    文章

    143

    瀏覽量

    17479
  • 嵌入式調試器

    關注

    1

    文章

    4

    瀏覽量

    8954
  • Printf
    +關注

    關注

    0

    文章

    81

    瀏覽量

    13625

原文標題:單步調試好用,printf宏也挺香~

文章出處:【微信號:最后一個bug,微信公眾號:最后一個bug】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    keil5中想確認工程中某一個.c文件是否出錯,如何利用printf調試?

    現在想確認工程中某一個.c文件是否出錯,如何利用printf調試
    發表于 03-21 08:03

    【NUCLEO-F412ZG試用體驗】2:調試準備測量函數運行時間

    到stlink的,如下圖所示:用STM32F412的串口3發送數據,就可以和電腦進行通信了。除了用串口調試,還可以用ITM功能,進行DEBUG printf調試還可以用ITM功能測量程序運行時
    發表于 12-02 22:22

    如何去解決STM32串口打印輸出亂碼的現象

    STM32串口打印輸出亂碼的解決辦法前言最近在試用uFUN開發板,下載配套的Demo程序,串口數據輸出正常,當使用另一個模板工程,調用串口printf調試功能時,輸出的卻是亂碼,最后發現是外部晶振
    發表于 08-12 06:08

    使用STM32最小系統要注意哪些問題呢

    STM32最小系統使用注意事項使用HAL庫CubeMX工具使用printf調試串口板子燒錄程序后沒反應使用HAL庫CubeMX工具在System Core->SYS里選擇Debug方式,否則
    發表于 11-25 09:10

    如何為stm32-f429啟用類似SWD/SWO printf()的調試功能?

    我對 stm32 和 arm 開發完全陌生,最近得到了我的 stm32-f429(ZIT6) 發現工具包。我只是遵循了一些教程,但無法正確啟用 SWO printf() 之類的功能,我遵循了一些
    發表于 12-27 06:46

    如何在STM32CubeIDE上為Cortex M0+進行“快速”調試

    printf 調試?或者,有沒有一種快速的方法可以讓我了解我的代碼在跳入和跳出中斷時是如何執行的?筆記:我知道這個文件:https : //www.st.com/resource/en
    發表于 02-03 08:31

    ESP-WROVER-KIT開發板不能用于開發涉及SD卡的代碼?

    如果要使用調試器,就沒有辦法為ESP32開發嗎?您有什么建議 - 將此卡發回并進行 PrintF() 調試
    發表于 03-01 07:41

    如何通過USB PC終端使用printf()調試OM13093評估板?

    幫助:通過 USB PC 終端使用 printf() 調試 OM13093 評估板我在 2018 年找到了一篇類似的帖子,但問題沒有得到直接回答——如何設置 OM13093 評估板硬件
    發表于 03-23 09:01

    RT1170 EVK MCUXpresso“SWD配置”檢測到0個可用的SWD設備?

    一切都調試得很好,然后我開始遇到這個問題。它是在嘗試讓 M4 控制 PRINTF 調試并調用 BOARD_InitDebugConsole 而不是 M7 之后啟動的我嘗試使用 LPCScrypt 和 program_CMSIS.
    發表于 04-11 06:27

    ESP-WROVER-KIT開發板不能用于開發涉及SD卡的代碼?

    如果要使用調試器,就沒有辦法為ESP32開發嗎?您有什么建議 - 將此卡發回并進行 PrintF() 調試?
    發表于 04-12 08:37

    STM8S串口打印調試信息(不使用printf)

    STM8S串口打印調試信息(不使用printf),感興趣可以看看。
    發表于 07-25 18:52 ?51次下載

    51單片機-printf調試用法

    #include <stdio.h>#include <reg52.h> void InitUART(void)//使用定時器1作為串口波特率發生器{ TH1 = 0xF3; //晶振12mhz 波特率串口上設為2400才不顯示亂碼代碼是4800 TL1 = TH1; TMOD |= 0x20; //定時器1方式2 SCON ...
    發表于 11-11 20:06 ?2次下載
    51單片機-<b class='flag-5'>printf</b><b class='flag-5'>調試</b>用法

    STM32最小系統使用注意事項

    STM32最小系統使用注意事項使用HAL庫CubeMX工具使用printf調試串口板子燒錄程序后沒反應使用HAL庫CubeMX工具在System Core->SYS里選擇Debug方式
    發表于 11-17 17:36 ?6次下載
    STM32最小系統使用注意事項

    51單片機串口通信調試printf函數重定向輸出打印

    51單片機串口通信以及printf調試串行通信1.串口初始化串口工作方式波特率設置通過軟件直接生成串口初始化代碼2.輸出到串口3.發送字符串到串口4.printf重定向到串口5.補充print
    發表于 11-20 16:36 ?16次下載
    51單片機串口通信<b class='flag-5'>調試</b><b class='flag-5'>printf</b>函數重定向輸出打印

    STM32串口打印輸出亂碼的解決辦法

    最近在試用uFUN開發板,下載配套的Demo程序,串口數據輸出正常,當使用另一個模板工程,調用串口printf調試功能時,輸出的卻是亂碼,最...
    發表于 01-26 18:29 ?2次下載
    STM32串口打印輸出亂碼的解決辦法