1. 程式人生 > >GDB調試工具、動態加載、內存管理(day04)

GDB調試工具、動態加載、內存管理(day04)

舉例 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)