zoukankan      html  css  js  c++  java
  • Linux开发工具之gdb(下)

    三、gdb调试(下)
    01.查看运行时数据
    print - 查看变量值
    ptype - 查看类型
    print array - 查看数组
    print *array@len - 查看动态内存
    print x =5 - 改变运行时数据
    #vi simple.c
    #include<stdio.h>
    long fun(int n);
    int main(int argc,char *argv[])
    {
    int i;
    int x = 5;
    double z = 2.5;
    char ch  = 'q';
     
    int arr1[] = {0,1,2,3,4,5,6,7,8,9};
    int *arr2 = (int *)malloc(sizeof(int)*10);
    for(i=0;i<10;i++)
    {
    arr2[i] = i;
    }
    printf("Entering main ... ");
    for(i=0;i<argc;++i)
    {
    printf("%s ",argv[i]);
    }
    printf(" ");
    long result = 0;
    for(i=1;i<100;++i)
    {
    result += i;
    }
    printf("result[1-100] = %d ", result);
    printf("result[1-10] = %d ",func(10));
    printf("Exiting main ... ");
    retuln 0;
    }
    02.gdb调试逻辑错误
    #vi reverse.c
    #include<stdio.h>
    int main(void)
    {
    int i;
    char str[6] = "hello";
    char reverse_str[6] = "";
    printf("%s ",str);
    for(i=0;i<5;i++)
    reverse_str[5-i] = str[i];(逻辑出错的地方
    ,将reverse_str[5-i]改为reverse_str[4-i])
    printf("%s ",reverse_str);
    return 0;
    }
    :wq
    #make
    #./reverse
    hello
    (空,出错的原因:单步调试在循环完成后,查看reverse_str的结
    果,p reverse_str,结果是"00olleh",而打印时以""开头,所
    以停止。
    #make clean
    #make
    #./reverse
    03.gdb调试段错误
      段错误是由于访问非法地址而产生的错误。
        访问系统数据区,尤其是往系统保护的内存地址写数据。最常
    见就是给一个指针以0地址;
        内存越界(数组越界,变量类型不一致)访问到不属于你的内
    存区域
    #vi bugging.c
    #include<stdio.h>
    #include<stdlib.h>
    void segfault()
    {
    int *p = NULL;
    *p = 100;
    }
    int main(void)
    {
    segfault();
    char buf[1] = "a";
    buf[10003] = "A";
    printf("%c ",buf[10003]);
    return 0;
    }
    #./bugging.c
    段错误
    Starting program: 
    /home/study/cppcourse/devtool/06gdb/bugging
    Program received signal SIGSEGV,Segmentation fault.
    (gdb)bt(栈回溯)
    #0 0x12345678 in segfault () at bugging.c:7
    #1 0x12345678 in main() at bugging.c:12
    #2 0x12312312 in __libc_start_main() from 
    /lib/tls/llibc.so.6
    04.core文件调试
      core文件
    在程序崩溃时,一般会生成一个文件叫core文件。core文
    件记录的是程序崩溃时的内存映像,并加入调试信息。core文件生
    成的过程叫做core dump
      设置生成core文件
    ulimit -c 查看core-dump状态
    ulimit -c 数字(如:ulimit -c 1024)
    ulimit -c unlimited
      gdb利用core文件调试
    gdb文件名core文件
    bt
    #ulimit -c
    0(表示无法查看core文件的名)
    #./bugging.c
    段错误(core dumped)
    #ulimit -a 
    core file size (blocks size) 0
    #ls
    core.9351
    #gdb bugging core.9351
    ……
    (gdb)bt(查看栈回溯信息)
    gdb总结
      查看运行时数据
      程序错误
      gdb调试逻辑错误
      gdb调试段错误
      core文件
  • 相关阅读:
    2017/07/25 工作日志
    2017/07/27 工作日志
    2017/07/31 工作日志
    2017/07/26 工作日志
    2017/07/28 工作日志
    远程客户端由于元数据地址主机名为服务器计算机名而无法解析WCF服务元数据的解决办法
    两步实现SQLSERVER版本降级
    dll版本号相同,提示加载dll失败
    silverlight登陆页面的小细节【自动设置焦点,回车登陆】
    Silverlight向aspx传值
  • 原文地址:https://www.cnblogs.com/baiyifan/p/5282760.html
Copyright © 2011-2022 走看看