天天看點

一種通過printf列印的調試程式的方法

    我們在寫代碼的時候,有時候需要調試程式的時候,對于初學者,可以通過簡單的增加printf函數列印,這樣能夠來跟蹤程式的蹤迹,舉個很簡單的代碼:

#include<stdio.h>
#include<stdlib.h>

int main(){

  int a = 4;
  int b = 2;
  int c = 5;
  int d = 800;
  
  printf("--[%s] %s:%d--\n", __FILE__, __FUNCTION__, __LINE__);
  int result = 100*a + 10*b + c;
  
  printf("--[%s] %s:%d--\n", __FILE__, __FUNCTION__, __LINE__);
  if (result > d){
    //do a
    printf("--[%s] %s:%d--\n", __FILE__, __FUNCTION__, __LINE__);
  } else {
    //do b
    printf("--[%s] %s:%d--\n", __FILE__, __FUNCTION__, __LINE__);
  }
  
  printf("--[%s] %s:%d--\n", __FILE__, __FUNCTION__, __LINE__);
  return 0;
}
           

通過 printf("--[%s] %s:%d--\n", __FILE__, __FUNCTION__, __LINE__); 列印運作的檔案名,函數名,行數。

/mnt/nfsroot/kervin/test/print$ ./a.out 
--[function.c] main:11--
--[function.c] main:14--
--[function.c] main:20--
--[function.c] main:23--
           

可以看到函數的詳細運作路徑。

    在有遇到kernel panic的時候,有時候通過printf無法直接定位到哪裡的問題,這是因為printf有滞後性,當kernel panic的時候,前面會有部分printf還沒來的及列印到序列槽,這樣會給我們分析定位問題造成困擾,我們可以在printf後面加上sleep函數,用來給足夠的時間,保證執行到的printf都能夠列印出來,

printf("--[%s] %s:%d--\n", __FILE__, __FUNCTION__, __LINE__);

sleep(1);

對新手小白還是有很有用處的,大神就可以忽略了。

繼續閱讀