zoukankan      html  css  js  c++  java
  • GDB调试工具、动态加载、内存管理(day04)

    一、程序中的错误处理
    在系统中定义了一个全局变量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能看到的是虚拟地址
  • 相关阅读:
    (4)事件处理——(1)事件处理(Handling Events)
    S/4HANA服务订单Service Order的批量创建
    如何给SAP C4C的产品主数据division配置出新的下拉选项
    为什么S/4HANA的生产订单创建后会自动release
    为什么S/4HANA的销售订单创建会触发生产订单的创建
    SAP云平台对Kubernetes的支持
    什么是SAP GUI的client
    SAPGUI系统登录页面配置的SAProuter有什么用
    SAP R/3系统的R和3分别代表什么含义,负载均衡的实现原理
    一些通过SAP ABAP代码审查得出的ABAP编程最佳实践
  • 原文地址:https://www.cnblogs.com/Kernel001/p/7732538.html
Copyright © 2011-2022 走看看