当前位置:Gxlcms > 数据库问题 > GDB调试工具、动态加载、内存管理(day04)

GDB调试工具、动态加载、内存管理(day04)

时间:2021-07-01 10:21:17 帮助过:23人阅读

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)

标签:dynamic   如何使用   stdio.h   span   void   step   补充   pen   char   

人气教程排行