進入不帶調試信息的函數
例子
#include <stdio.h>
#include <pthread.h>
typedef struct
{
int a;
int b;
int c;
int d;
pthread_mutex_t mutex;
}ex_st;
int main(void) {
ex_st st = {1, 2, 3, 4, PTHREAD_MUTEX_INITIALIZER};
printf("%d,%d,%d,%d\n", st.a, st.b, st.c, st.d);
return 0;
}
技巧
默認情況下,gdb不會進入不帶調試信息的函數。以上面代碼為例:
(gdb) n
15 printf("%d,%d,%d,%d\n", st.a, st.b, st.c, st.d);
(gdb) s
1,2,3,4
16 return 0;
可以看到由於printf函數不帶調試信息,所以“s”命令(s是“step”縮寫)無法進入printf函數。
可以執行“set step-mode on”命令,這樣gdb就不會跳過沒有調試信息的函數:
(gdb) set step-mode on
(gdb) n
15 printf("%d,%d,%d,%d\n", st.a, st.b, st.c, st.d);
(gdb) s
0x00007ffff7a993b0 in printf () from /lib64/libc.so.6
(gdb) s
0x00007ffff7a993b7 in printf () from /lib64/libc.so.6
可以看到gdb進入了printf函數,接下來可以使用調試彙編程序的辦法去調試函數。
詳情參見gdb手冊
貢獻者
nanxiao