Linux调试器-gdb使用

1. 背景

●  程序的发布方式有两种,debug模式和release模式

●  Linux gcc/g++出来的二进制程序,默认是release模式

●  要使用gdb调试,必须在源代码生成二进制程序的时候, 加上 -g 选项(生成debug信息)

●  介绍一下readelf -S,可以读取一个可执行程序的二进制构

●  下载命令:yum install -y gdb

●   查看gdb版本 : gdb --version

2. 介绍调试命令

gdb binFile 退出: ctrl + d quit 调试命令:

●  gdb 文件:进入调试环境·

●  list/l 行号:显示binFile源代码,接着上次的位置往下列,每次列10行。
●  list/l 函数名:列出某个函数的源代码。

●  r或run:运行程序。

●  n 或 next:单条执行。

●  s或step:进入函数调用,可以在函数进行逐语句的调试

●  break(b) 行号:在某一行设置断点

●  info break :查看断点信息。 

●  print(p):打印表达式的值,通过表达式可以修改变量的值或者调用函数

●  p 变量:打印变量值。p &i:查看变量的地址

●  set var:修改变量的值

●  continue(或c):从当前位置开始连续而非单步执行程序
●  run(或r):从开始连续而非单步执行程序

●  delete breakpoints:删除所有断点

●  d n(delete breakpoints n):删除序号为n的断点

●  disable breakpoints:禁用断点

●  enable breakpoints:启用断点

●  info(或i) breakpoints:参看当前设置了哪些断点

●  display 变量名:跟踪查看一个变量,每次停下来都显示它的值

●  undisplay:取消对先前设置的那些变量的跟踪

●  until X行号:跳至X行

●  finish:执行到当前函数返回,然后挺下来等待命令

●  breaktrace(或bt):查看各级函数调用及参数

●  info(i) locals:查看当前栈帧局部变量的值

●  c :下一个断点

●  quit:退出gdb,历史命令会消失

3. 理解

●  和windows IDE对应例子

4.开始使用

使用环境

//makefile

mycode:mycode.c
gcc -o $@ $^ -g
.PHONY:clean
clean:
rm -f mycode

//mycode.c


#include

void Print3()

{

        printf("hello printf1\n");

}

void Print2()

{

        printf("hello printf1\n");

        Print3();

}

void Print1()

{

        printf("hello printf1\n");

        Print2();

}

int addToTop(int top)

{

        int res = 0;

        int i = 1;

        for(; i <= top; i++)

        {

                res += i;

        }

        Print1();

        return res;

}

int main()

{

        printf("debug begin\n");

        int top = 100;

        int sum = addToTop(top);

        printf("sum: %d\n", sum);

        printf("debug end\n");

        return 0;

}

readelf -S

查看二进制文件代码

Linux调试器-gdb使用_第1张图片

Linux调试器-gdb使用_第2张图片

list 行号的使用

一般情况下以行号为中间行输出,特殊情况下如行号靠近开头或结尾。

Linux调试器-gdb使用_第3张图片

list (l)  0 后回车

可以打印所有代码

Linux调试器-gdb使用_第4张图片

设置断点和打印断点信息

Linux调试器-gdb使用_第5张图片

Linux调试器-gdb使用_第6张图片

删除段点 d + 断点编号/ d 删除所有断点

(退出调试,断点信息全部消失)

Linux调试器-gdb使用_第7张图片

Linux调试器-gdb使用_第8张图片

设置断点后,r+回车,运行时会在断点处停止

Linux调试器-gdb使用_第9张图片

n(next):逐过程,把函数直接当成语句,直接运行函数

Linux调试器-gdb使用_第10张图片

s(step):逐语句,会进入函数,不跳过代码块

Linux调试器-gdb使用_第11张图片

显示变量

Linux调试器-gdb使用_第12张图片

长显示变量和取消长显示

Linux调试器-gdb使用_第13张图片

Linux调试器-gdb使用_第14张图片

Linux调试器-gdb使用_第15张图片

限定代码出错的上下文

until 行号:

快速运行到指定行

finish

不小心进入函数时,结束函数,返回结果,可以用于测试函数。

c(continue)

直接运行到下一个断点

Linux调试器-gdb使用_第16张图片

disable n 和 enable n

关闭断点和开启断点

Linux调试器-gdb使用_第17张图片

set var设置变量

Linux调试器-gdb使用_第18张图片

bt:查看各级函数调用及参数

Linux调试器-gdb使用_第19张图片

info locals:查看当前栈帧局部变量的值

你可能感兴趣的:(linux,运维,服务器)