強力Debug技巧: 攔截function & Backtrace (2)
第一招是攔截任意 standard C library 的 function 在下面的範例裡, 攔截的對象是 atoi() 首先主程式長這個樣子... Main program (hello.c) #include <stdio.h> int main() { printf("I love debug >_<\n"); printf("atoi(100) = %d\n", atoi("100")); return 0; } 用 gcc 編譯這個程式並且執行, 結果大概長這樣子: gcc hello.c -o hello ./hello I love debug >_< atoi(100) = 100 ---- 所謂的攔截atoi(), 就是寫了另一個atoi(), 名字和 standard C library 的一樣. 讓程式在執行時, 呼叫到自己寫的atoi(), 而不是library提供的. 這個偽atoi()的程式碼如下: Wrapper function (atoi_wrapper.c) #define _GNU_SOURCE #include <stdio.h> #include <dlfcn.h> // ATOI-wrapper int atoi(const char *nptr) { int ret; // Get pointer of REAL-atoi by shared library int (*real_atoi)(const char *nptr) = dlsym(RTLD_NEXT, “atoi”); // Before REAL-atoi, do some hacking printf(“[ATOI] before REAL atoi()\n”); // Call REAL-atoi ret = (*real_atoi)(nptr); // After REAL-atoi, do some hacking...