zoukankan      html  css  js  c++  java
  • gdb初步窥探

    本文是通过学习左耳朵皓帝的文章,详见:http://blog.csdn.net/haoel

    1.使用gdb

    gdb主要是用来调试c和c++程序,首先在编译前我们先把调试信息加到可执行程序当中,使用参数 -g 可以实现这一点。

    dzhwen@deng:~/first$ gcc -g tst.c -o tst
    dzhwen@deng:~/first$ g++ -g tst.cpp -o tst

    2.启动gdb

    1.我们一般使用:gdb + 程序名字来启动gdb。

    dzhwen@deng:~/first$ gdb tst

    当然也不乏其他方法:

    2、gdb <program> core
           用gdb同时调试一个运行程序和core文件,core是程序非法执行后core dump后产生的文件。

    3、gdb <program> <PID>
           如果你的程序是一个服务程序,那么你可以指定这个服务程序运行时的进程ID。gdb会自动attach上去,并调试他。program应该在PATH环境变量中搜索得到。

    3.常见的gdb

    1.help : 查看常见的命令帮助

    (gdb) help
    List of classes of commands:
    
    aliases -- Aliases of other commands
    breakpoints -- Making program stop at certain points
    data -- Examining data
    files -- Specifying and examining files
    internals -- Maintenance commands
    obscure -- Obscure features
    running -- Running the program
    stack -- Examining the stack
    status -- Status inquiries
    support -- Support facilities
    tracepoints -- Tracing of program execution without stopping the program
    user-defined -- User-defined commands
    
    Type "help" followed by a class name for a list of commands in that class.
    Type "help all" for the list of all commands.
    Type "help" followed by command name for full documentation.
    Type "apropos word" to search for commands related to "word".
    Command name abbreviations are allowed if unambiguous.

    2.list,简写l:列出源码

    (gdb) list
    7        {
    8            sum += i;
    9        }
    10        return sum;
    11    }
    12    
    13    int main()
    14    {
    15        int i;
    16        long result = 0;

    3.回车:重复上一次的命令

    (gdb) 
    17        for(i = 1;i <= 100;++i)
    18        {
    19            result += i;
    20        }
    21    
    22        printf("result[1-100] = %ld
    ",result);
    23        printf("result[1-250] = %d
    ",func(250));
    24        return 0;
    25    }
    26    

    4.break + 数字  或者  break + 函数名 —— 设置断点

    (gdb) break 15
    Breakpoint 1 at 0x804841a: file tst.c, line 15.
    (gdb) break func
    Breakpoint 2 at 0x80483ea: file tst.c, line 5.

    5.info + 信息 —— 查看各种信息

    (gdb) info break —— 查看断点信息
    Num     Type           Disp Enb Address    What
    1       breakpoint     keep y   0x0804841a in main at tst.c:15
    2       breakpoint     keep y   0x080483ea in func at tst.c:5

    6.run(简写r)—— 运行程序,遇到断点自动中断。

    (gdb) run
    Starting program: /home/dzhwen/first/tst 
    
    Breakpoint 1, main () at tst.c:16
    16        long result = 0;

    7.next(简写n) —— 单条语句执行。

    (gdb) next
    17        for(i = 1;i <= 100;++i)

    8.continue —— 继续执行(直到下一个断点中止)

    (gdb) continue
    Continuing.
    result[1-100] = 5050
    
    Breakpoint 2, func (n=250) at tst.c:5
    5        int sum = 0,i;

    9.print(简写p) + 变量名 —— 打印变量的值,print命令简写。

    (gdb) p sum
    $1 = 0
    (gdb) n
    6        for(i = 0;i < n;++i)
    (gdb) p i
    $2 = 1

    10,bt —— 查看程序堆栈(包括main函数和其他调用的函数)

    (gdb) bt
    #0  func (n=250) at tst.c:6
    #1  0x08048461 in main () at tst.c:23

    11.finish —— 运行至函数退出

    (gdb) finish
    Run till exit from #0  func (n=250) at tst.c:6
    0x08048461 in main () at tst.c:23
    23        printf("result[1-250] = %d
    ",func(250));
    Value returned is $7 = 31125

    12.quit(简写q) —— 退出gdb

    (gdb) quit

    gdb初步就这些了吧,多多指教!

  • 相关阅读:
    Android APK反编译
    android 安卓APP获取手机设备信息和手机号码的代码示例
    Android-- ArrayAdapter用法举例(转载)
    Android--ListView 分割线
    Android——检测TXT文件中是否含有双字节字符
    Android--------从一个包中的Avtivity创建另外另外一个包的Context
    百度地图技术大揭秘
    Lotusscript统计在线用户数
    代理中如何获取参数么
    DXL之通过程序修改Domino的设计
  • 原文地址:https://www.cnblogs.com/sysu-blackbear/p/3756091.html
Copyright © 2011-2022 走看看