码迷,mamicode.com
首页 > 数据库 > 详细

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

时间:2017-10-25 23:59:20      阅读:410      评论:0      收藏:0      [点我收藏+]

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

一、程序中的错误处理
在系统中定义了一个全局变量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)

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

原文地址:http://www.cnblogs.com/Kernel001/p/7732538.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!