GDB調試工具、動態加載、內存管理(day04)
阿新 • • 發佈:2017-10-26
舉例 bre blog 動態加載 gcc 加載 nbsp makefile stdin
一、程序中的錯誤處理 在系統中定義了一個全局變量errno。在這個全局變量中存放著系統調用或者庫函數出錯的信息(錯誤編號)。然後根據錯誤編號獲取錯誤信息。 舉例說明: 打開一個文件,如果這個文件不存在,查看錯誤信息。 代碼參見 file.c perror(3) strerror(3) #include <stdio.h> void perror(const char *s); 功能:輸出一條系統的錯誤消息 參數: s:用戶給定的字符串。 返回值: 不用返回。 補充: FILE *stdin; 標準輸入 鍵盤 FILE *stdout; 標準輸出 顯示器 FILE*stderr; 標準錯誤輸出 顯示器 #include <string.h> char *strerror(int errnum); 功能:返回錯誤編號對應的描述信息 參數: errnum:指定錯誤編號 返回值: 錯誤號對應的錯誤描述信息 如果錯誤號沒有定義,返回Unknown error nnn。 二、GDB調試工具的使用 gcc gdb bash makefile 如何使用gdb調試工具調試程序? 1、在編譯鏈接程序的時候,加上-g/-ggdb參數。編譯輸出的可執行文件中包含調試信息。 tmath$ls add.c mul.c point.c test.c t_math.h tmath$gcc add.c mul.c test.c tmath$ls add.c a.out mul.c point.c test.c t_math.h tmath$ls -l a.out -rwxrwxr-x 1 tarena tarena 7332 8月 3 11:19 a.out tmath$gcc add.c mul.c test.c -g tmath$ls -l a.out -rwxrwxr-x 1 tarena tarena 9580 8月 3 11:20 a.out 2、使用gdb調試工具對帶有調試信息的可執行文件進行調試 gdb a.out gdb調試命令 l list 列出程序清單 b 函數的名字或者行號 breakpoint 設置斷點 r run 執行程序 p 變量名 輸出變量的值 n next 下一條 s step 下一步 q quit 退出調試int a,b,c; a=b=c=3; 函數的參數。指針類型的變量作為函數的參數。 值-結果參數。舉例說明 代碼參見 value.c 三、動態加載 在程序中,根據程序的需要動態加載某個庫函數,這種行為稱為動態加載。 系統為實現動態加載提供了以下函數: dlopen(3) #include <dlfcn.h> void *dlopen(const char *filename,int flag); 功能:加載一個動態庫文件,返回一個地址 參數: filename:指定了動態庫的文件名字 flag: RTLD_LAZY:懶加載 RTLD_NOW:立即加載 返回值: NULL 失敗 char *dlerror(void); 功能:獲取dlopen、dlclose、dlsym函數產生的錯誤。 參數: void 返回值: 返回一個字符串。這個字符串描述了錯誤產生的原因。 void *dlsym(void *handle,const char*symbol); 功能:在內存查找動態庫中的symbol加載到內存的地址。 參數: handle:dlopen(3)的返回值。指定了要操作的庫函數 symbol:指定了要找符號。 返回值: NULL 代表錯誤 返回symbol加載到內存的地址。 int dlclose(void *handle); 功能:將與handle相關的動態庫文件的引用計數減1。庫文件的引用計數減到0的時候,動態庫從內存中卸載。移除 參數: handle:指定了要關閉的動態庫。是dlopen(3)的返回值 返回值: 非0 錯誤 0 成功 Link with -ldl. 舉例說明 動態加載的使用。將libpmath.so動態庫文件加載到內存,並使用函數庫中的函數。 代碼參見 dynamic.c 四、內存管理 寄存器 cache 內存 硬盤 雲 頁 頁表 頁框 虛擬內存 物理內存 虛擬地址空間 物理地址 演示段錯誤 segment.c 總結: 一、系統中的錯誤處理 errno perror(3) strerror(3) 二、gdb調試工具的使用 三、動態加載 按需加載 dlopen(3) dlclose(3) dlsym(3) 四、內存管理基礎 頁 頁表 頁框 物理內存 虛擬內存 虛擬地址 物理地址 在有操作系統的機器上,cpu能看到的是虛擬地址
GDB調試工具、動態加載、內存管理(day04)