GDB调试工具、动态加载、内存管理(day04)
一、程序中的错误处理
在系统中定义了一个全局变量errno。在这个全局变量中存放着系统调用或者库函数出错的信息(错误编号)。然后根据错误编号获取错误信息。 举例说明: 打开一个文件,如果这个文件不存在,查看错误信息。 代码参见 file.c perror() strerror()
#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调试工具调试程序?
、在编译链接程序的时候,加上-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 tarena tarena 8月 : a.out tmath$gcc add.c mul.c test.c -g
tmath$ls -l a.out
-rwxrwxr-x tarena tarena 8月 : a.out 、使用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=;
函数的参数。指针类型的变量作为函数的参数。
值-结果参数。举例说明 代码参见 value.c 三、动态加载
在程序中,根据程序的需要动态加载某个库函数,这种行为称为动态加载。
系统为实现动态加载提供了以下函数:
dlopen()
#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()的返回值。指定了要操作的库函数
symbol:指定了要找符号。
返回值:
NULL 代表错误
返回symbol加载到内存的地址。 int dlclose(void *handle);
功能:将与handle相关的动态库文件的引用计数减1。库文件的引用计数减到0的时候,动态库从内存中卸载。移除
参数:
handle:指定了要关闭的动态库。是dlopen()的返回值
返回值:
非0 错误
成功 Link with -ldl. 举例说明 动态加载的使用。将libpmath.so动态库文件加载到内存,并使用函数库中的函数。 代码参见 dynamic.c 四、内存管理 寄存器
cache
内存
硬盘
云 页 页表 页框 虚拟内存 物理内存 虚拟地址空间 物理地址
演示段错误 segment.c 总结:
一、系统中的错误处理
errno perror() strerror() 二、gdb调试工具的使用
三、动态加载
按需加载 dlopen() dlclose() dlsym() 四、内存管理基础
页 页表 页框
物理内存 虚拟内存 虚拟地址 物理地址
在有操作系统的机器上,cpu能看到的是虚拟地址
GDB调试工具、动态加载、内存管理(day04)的更多相关文章
- Unity动态加载和内存管理(三合一)
原址:http://game.ceeger.com/forum/read.php?tid=4394#info 最近一直在和这些内容纠缠,把心得和大家共享一下: Unity里有两种动态加载机制:一是Re ...
- QT/C++插件式框架、利用智能指针管理内存空间的实现、动态加载动态库文件
QT.C++插件式框架.主要原理还是 动态库的动态加载. dlopen()函数.下面为动态加载拿到Plugininstance对应指针.void**pp=(void**)dlsym(handle,&q ...
- 利用PHP的debug_backtrace函数,实现PHP文件权限管理、动态加载
简述 可能大家都知道,php中有一个函数叫debug_backtrace,它可以回溯跟踪函数的调用信息,可以说是一个调试利器. 好,来复习一下 01 one(); 02 03 function one ...
- Android之Android apk动态加载机制的研究(二):资源加载和activity生命周期管理
转载请注明出处:http://blog.csdn.net/singwhatiwanna/article/details/23387079 (来自singwhatiwanna的csdn博客) 前言 为了 ...
- (转)利用PHP的debug_backtrace函数,实现PHP文件权限管理、动态加载 【反射】
原文地址:http://www.cnblogs.com/melonblog/archive/2013/05/09/3062303.html 原文作者:豆浆油条 - melon 本文示例代码测试环境是W ...
- CS.动态加载DLL.动态生成.运行代码.BS.AutoFac管理实现类
以英雄联盟为例.界面上经常有Load....xxxx.dll.一般都是加载子系统.比如装备系统.英雄系统等.在实际开发中很多项目非常庞大.都会分割成独立子解决方案开发.后期就需要加载回来.一般都是利用 ...
- 动态加载框架DL分析
动态加载框架DL分析 插件化开发,主要解决三个问题1.动态加载未安装的apk,dex,jar等文件2.activity生命周期的问题,还有service3.Android的资源调用的问题 简单说一下怎 ...
- Android 插件开发,做成动态加载
为什么需要插件开发: 相信你对Android方法数不能超过65K的限制应该有所耳闻,随着应用程序功能不断的丰富,总有一天你会遇到一个异常: Conversion to Dalvik format fa ...
- Android中的动态加载机制
在目前的软硬件环境下,Native App与Web App在用户体验上有着明显的优势,但在实际项目中有些会因为业务的频繁变更而频繁的升级客户端,造成较差的用户体验,而这也恰恰是Web App的优势.本 ...
随机推荐
- quick-cocos2d-x教程7:程序框架内framework文件夹分析
framework是整个框架执行时的实现代码.所以一定要细致看这个文件夹的文件.我们先从framework文件夹中的init.lua分析起走. init.lua文件里,框架初始化时,会自己主动加载下面 ...
- POJ 3233 Matrix Power Series 二分+矩阵乘法
链接:http://poj.org/problem?id=3233 题意:给一个N*N的矩阵(N<=30),求S = A + A^2 + A^3 + - + A^k(k<=10^9). 思 ...
- 冒泡排序Vs直接选择排序
什么是排序?为什么要使用排序?事实上我们生活中处处都用到了排序.拿字典来说,如今,我们要在字典中查找某个字(已经知道这个字的读音),首先.我们须要依据这个字的读音,找到它所所在文件夹中的位置,然后依据 ...
- ubuntu下eclipse连接mysql
提示:一定要保证电脑处于联网状态 我们要下载一个mysql-connector-java-5.0.8-bin.jar的东西(当然这个jar包的版本号和你的mysql版本号的关系不是非常大),放到你新建 ...
- 创造HTTPS的是个神
HTTP 是一个明文传输的协议,很多网络监听工具都可以轻易窃取网络中传输的用户信息,如密码,信用卡, 直到后来发明HTTPS, 世界一下子安静了 Why HTTPS? HTTPS可以保证用户提交的信息 ...
- Appium + python - input操作实例
import osimport time as t adb = 'adb shell input tap 400 500'os.system(adb) t.sleep(5) class keyeven ...
- centos7用rpm安装mysql5.7【初始用yum安装发现下载非常慢,就考虑本地用迅雷下载rpm方式安装】
1.下载 4个rpm包 mysql-community-client-5.7.26-1.el7.x86_64.rpmmysql-community-common-5.7.26-1.el7.x86_64 ...
- 进击的Python【第二十二章】
day22 知识点概要 - Session - CSRF - Model操作 - Form验证(ModelForm) - 中间件 - 缓存 - 信号 内容详细: 1. Session 基于Cookie ...
- .net core2.0 中使用DB First
一.新建一个控制台测试项目 1.1.添加引用 1.2.修改项目文件 1.3.添加红框的内容 <ItemGroup> <DotNetCliToolReference Include=& ...
- Windows phone开发 页面布局之屏幕方向
(博客部分内容参考Windows phone开发文档) Windows phone的屏幕方向是利用Windows phone设备的方向传感器提供的数据实现切换的. Windows Phone支持纵向和 ...