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