C\C++調試技巧

jopen 12年前發布 | 65K 次閱讀 調試 C/C++開發

在調試代碼時,有時會遇到報錯的的函數是沒問題,而是調用它的函數傳入的參數是異常的,而又沒法通過代碼準確定位到具體調用的位置的情況,特別是對一些基礎函數,往往會出現這種情況,因為工程中調用它們的地方太多,而且有時會漏掉返回值檢測。這里給出一個快速找出調用者是誰的方法。

//filename: tt.h
#include <stdio.h>

int foo(int p);

#define foo(_a) \
    do { \
        printf("[%s:%d]call foo()\n", __FUNCTION__, __LINE__); \
        foo(_a); \
    } while (0)

//filename: tt.c
#include "tt.h"

#ifdef foo
#undef foo
#endif

int foo(int p)
{
    printf("input = %d\n", p);
    return p;
}

//filename: main.c
#include "tt.h"

int main()
{
    foo(1024);
    return 0;
}

未定義#define foo(_a)宏時執行結果如下(將tt.h中定義foo的那段代碼注釋掉):

$ cc main.c tt.c
$ ./a.out

>> input = 1024

定義了#define foo(_a)宏之后執行結果如下:

$ cc main.c tt.c
$ ./a.out

>> [main:5]call foo()
>> input = 1024

 通過定義與函數一致的宏,調用的時候執行了修改了之后的代碼,這樣我們就可以在其中添加一些我們需要的信息,方便我們調試。

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!