Linux下的GDB调试器常用指令 1....,将会提示一下图错误 因为no_g.out这个可执行文件不包含用于调试的信息,输入quit再按回车即可,通过gdb yes_g.out指令执行包含调试信息的可执行文件,看到以下输出 此时可以正常进入调试...指令或者指令简写i b查看当前的断点,如下图结果 使用run指令或者r指令执行程序,此时命中了第11行断点,如下图内容 此时可以查看变量的值,如查看i的值,可以使用print i或者p i指令,如下图...使用p N 查看N的值,如下图 此时程序执行到第11行处,如果我们需要继续执行,输入continue指令并按回车即可,程序将执行到代码的第12行,如下图 因为我们是在while循环体内,i的值将不断变化...在gdb调试中,如果我们只按回车键,gdb将执行我们最后一次输入的指令,所以我们可以一直按回车键继续让程序单步执行。
b:设置断点,包括以下几种: s:执行一行源程序的代码,如果此行代码中存在函数调用,则进入该函数。 n:执行一行源程序的代码,此代码中的函数调用执行完成。...si:类似于s命令,不同的是,si针对的是汇编指令,而s针对的是源代码。 ni:类似于n命令,不同的是,ni针对的也是汇编指令,而n针对的是源代码。...如希望程序中断后显示即将被执行的下一条汇编指令,可使用如下命令:display /i pc,其中</script...cd dir:运行GDB,使用dir作为gdb的工作目录。 se File:从File读取符号表并把它作为可执行文件。 -write:开通enable往可执行文件和核心文件写的权限。...set:设置变量的值。如set val = 2即为把2保存到val变量中;设置输入参数使用set args a b c(a,b,c分别为对应输入参数)。
本文是该系列的第三篇文章,你可以通过以下链接查看过去的内容 1. Linux中编译C++代码的g++工具,以及g++的常用操作指令 2. Linux下C++命令行编译示例 1....概述 GDB(GNU Debugger) 是一个用来调试 C/C++ 程序的功能的调试器,是Linux系统开发C/C++最常用的调试器 程序员可以使用GDB来跟踪程序中的错误,从而减少程序员的工作量 Linux...开发C/C++一定要熟悉GDB VScode是通过调用GDB调试器来实现工作的 Windows中,常用的集成开发环境,如VS,VC等已经内嵌了相应的调试器 GDB的主要功能: 设置断点(断点可以是条件表达式...start(s) #单步执行,运行程序,停在第一行执行语句 list(l) #查看源代码(list-n从第n行开始查看代码。...gdb 进行调试,例如:gcc -g main.cpp -o main 回车键:重复上一条命令 > 本文来自自己的学习笔记
gcc是GCC中的GUN C Compiler(C 编译器) g++是GCC中的GUN C++ Compiler(C++编译器) gdb是是GCC中的GUN 调试工具 linux和win换行符 windows...#常用场景 # -DDEBUG 定义DEBUG宏 可能文件中又DEBUG宏部分的相关信息 用个DDEBUG来选择开去或关闭DEBUG #如 1....printf("in\n"); 7. return 0; } #编译的时候 使用g++ -DDEBUG main.cpp #第4行的代码会被执行 [root@master test]# tree ..../sharemain GDB调试 执行gdb [exefilename] 进入gdb调试程序 help(h) #查看帮助 在gdb中输入 Help + 命令 run(r) #重新开始运行文件 start...#单步执行 list(l) #查看源代码(list-n 从第n行开始查看代码 list+函数名 查看具体函数) set #设置变量值 next(n) #单步调试(越过函数) step
函数库 函数库一般分为静态库和动态库两种: 静态库是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也 就不再需要库文件了。...其后缀名一般为.a 动态库与之相反,在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时 链接文件加载库,这样可以节省系统的开销。...运行程序 n 或 next:单条执行 s或step:进入函数调用 until X行号:跳至X行 finish:执行到当前函数返回,然后挺下来等待命令 continue或c:运行到下一个断点处...set var 变量=x:修改变量的值为x 显示: list/l n:显示从第n行开始的源代码,接着上次的位置往下列,每次列10行 list/l 函数名:列出某个函数的源代码 print/p...info/i locals:查看当前栈帧当中局部变量的值 断点: break/b n:在第n行设置断点 break 函数名:在某个函数开头设置断点 info break/b:查看已打断点信息
但是如何在Linux上调式代码我们还不知道,所以今天要学的是Linux调试器——gdb 的基本使用。 1. 准备工作及知识补充 那要使用调式器调式,首先我们得有代码,有可执行程序。...我们说了Linux中的调式器是gdb,那如何使用gdb调式 如果你的机器上没有gdb可以先安装一下:sudo yum install -y gdb 然后调式的话,第一步直接gdb+可执行文件名...然后我们输入相应的指令去调式的话,会发现调不成,有一个报错说的是找不到调试符号 其实就是生成的可执行程序中没有调式信息,怎么回事?...Debug 配置通常会禁用一些优化,以便在调试过程中能够更好地观察程序的行为。 此配置的构建速度较慢,生成的可执行文件较大。...n/next:逐过程 那逐语句呢? 我们重新开始调式 然后又停到了第16行 那我现在想进入函数怎么做?
进入vi后光标停留在文件的第一行行首,如希望停留在其他行,可以使用如下的命令: vi +n [filename]: 进入vi后光标位于第n行 vi十[filename] :进入vi后光标位置为文件尾 vi...gdb [可执行文件名] 出现 (gdb)#这里可以输入调试命令 注意:可执行文件编译的时候,必须加入参数-g,才可以使用gdb 6.2 gdb 常用命令 进入gdb调试界面后,可以输入以下命令:...continue:继续运行,到下一个断点停止 run:执行当前被调试的程序。 quit:退出gdb 。 break n:在第n行设置断点,这将使程序执行到这里时被挂起。...Delete n:去除第n号断点 Disable n:暂停使用第n号断点 Enable n:启动第n号断点 Break :从后向前清除断点 print 变量名:显示变量的值 file 文件名:如果直接执行...gdb,没有跟文件名,可以通过这个调入想要调试的可执行文件。
常用的反汇编工具一般需要执行三个步骤,1,加载要反汇编的二进制文件;2,从二进制文件中找到所有机器指令;3,将指令转换为汇编语句;通常第2步是一个难点,由于机器指令与通常的二进制数值无异,因此很容易把不是指令的数值认为是机器指令...由此会带来两种错误,一种是将数值转换成无效机器指令,一种更糟糕,数值正好对应了某条机器指令,于是给后面的分析带来巨大的干扰,如下图所示: ?...,只要输出几行就行,后者是让gdb将运行过程中的信息输出到文件gdb.txt,然后执行命令run,一运行程序就里面暂停住。...过一会使用ctrl+c退出,然后执行命令quit退出gdb,此时我们使用命令wc -l gdb.txt可以发现它已经包含几万条内容。...使用head -n 20 gdb.txt可以打印出前20条,使用正则表达式对文件内容进行过滤: egrep '^=> 0x[0-9a-f]+:' gdb.txt | head -n 20 动态反汇编只能让我们解析程序运行经过的指令
创建工作目录 目录命名为班级加姓名的格式,如 1banz3 参考代码: mkdir 1banz3 # 切到 1banz3 目录: cd 1banz3 2....可以使用cat命令查看文件的内容,如查看test.c:cat test.c。 3....使用GDB调试工具 #键入gdb命令,回车确认,进入gdb程序中 gdb 如果提示没有gdb指令,可以运行sudo yum install gdb安装GDB调试工具 安装过程中,提示做选择时可以输入y按回车继续...(简单的说就是会出现两次选择,都按y然后按enter继续) 启动GDB后,某些行前面会显示(gdb)提示符,所以gdb指令都输在(gdb)提示符的后面。...运行test程序 在(gdb)提示符后边输入run命令运行当前装入的程序,也就是test程序。 此时提示程序在第6行出错,也就是10/i操作引发了异常。
-g选项的作用是:在可执行文件中加入源码信息,比如:可执行文件中第几条机器指令对应源代码的第几行,但并不是把整个源文件都嵌入到可执行文件中,而是在调试时必须保证gdb能找到源文件。...(y or n) y root@iZ2zeeailqvwws5dcuivdbZ:~/2/02# 在start命令后,每输入一个n就能够单步执行一条语句(输入一个命令后,直接回车表示最近输入命令的含义...:~/2/02# gdb a会进入a可执行程序的gdb模式,start命令就使程序准备运行程序中的第一条语句。...[9] gdb基本命令 gdb有许多有用的命令如list(显示源代码),这样就可以结合源码与调试信息更好的进行调试。...si 可以一条指令一条指令地单步调试。 info registers 可以显示所有寄存器的当前值。在gdb中表示寄存器名时前面要加个$,例如p $esp可以打印esp寄存器的值。
+ 编译的时候 -g 将编译信息增加到可执行文件中 $gcc -g -Wall hello.c -o hello $g++ -g -Wall hello.cpp -o hello 启动方法 gdb gdb...-se file 从指定文件中读取符号表信息,并把他用在可执行文件中。 -core -c 调试时core dump的core文件。...break 命令没有参数时,表示在下一条指令处停住。...stepi 或 si nexti 或 ni 单步跟踪一条机器指令!一条程序代码有可能由数条机器指令完成. 如果你程序是多线程的话,你可以定义你的断点是否在所有的线程上,或是在某个特定的线程。...backtrace bt -n表一个负整数,表示只打印栈底下n层的栈信息。 frame f n是一个从0开始的整数,是栈中的层编号。
本文主要讲解如何在Ubuntu上搭建arm交叉编译、运行环境。...); return 0; } 下面的命令,首先编译main.c生成arm平台下的可执行文件a.out,然后通过file命令可以看到,a.out为arm平台下的elf可执行文件: helloworld...加上这个参数后,生成的可执行文件为静态链接的。如果不加这个参数,gdb调试的时候单步执行功能不正常,符号表也找不到。...该指令运行后,当前窗口会被阻塞住。...Breakpoint 1, main () at main.c:5 5 printf("helloworld\n"); 四、参考文档 Linux下ARM程序的编译运行及调试 qemu相关说明文档
我们都知道,在使用gcc编译时,可以使用-g选项在可执行文件中嵌入更多的调试信息,那么具体嵌入了哪些调试信息?这些调试信息是如何与二进制的指令之间进行相互交互?...在调试窗口输入设置断点指令“break 5”,此时gdb做2件事情: 对第5行源码所对应的第10行汇编代码存储到断点链表中。...在汇编代码的第10行,插入中断指令INT3,也就是说:汇编代码中的第10行被替换为INT3。 ?...此刻,就相当于下一条执行的指令是汇编代码中的第10行,也就是源码中的第5行。...gdb在接收到next执行时,会计算出第7行源码,应该对应到汇编代码的第14行,于是gdb就控制汇编代码中的PC指针一直执行,直到第13行执行结束,也就是PC指向第14行时,就停止下来,然后继续等待用户输入调试指令
其中: gcc是在x86架构指令用的。 arm-linux- gcc是RSIC(精简指令集)ARM架构上面使用。 他们会把源程序编译出不同的汇编指令然后生成不同平台的可执行文件。...6.1.2.1 预处理: C/C++源文件中,以“#”开头的命令被称为预处理命令,如包含命令“#include”、宏定义命令“#define”、条件编译命令“#if”、“#ifdef”等。...常用的过程控制选项有: (1)预处理选项(-E) C/C++源文件中,以“#”开头的命令被称为预处理命令,如包含命令“#include”、宏定义命令“#define”、条件编译命令“#if”、“...但是现在一些项目工程中的源文件不计其数,其按类型、功能、模块分别放在若干个目录中,如果仍然使用在终端输入若干条命令,那显然不切实际,开发效率极低。程序员肯定不会被这些繁琐的事情,影响自己的开发进度。...sub.o add.o -o output 我们将上面一条命令变成了四条,分别编译成源文件的目标文件,最后再将所有的目标文件链接成可执行文件。
gdb的启动 准备内容 一般来说GDB主要调试的是C/C++的程序。要调试C/C++的程序,首先在编译时,必须要把调试信息加到可执行文件中。...如: 对于.c文件: gcc -g -o hello hello.c 对于.cpp文件: g++ -g -o hello hello.cpp 启动GDB的方法有以下几种: gdb program program...比如输入b连续按下两次tab,可以查看gdb的所有b开头的gdb指令 2....即 tree3_01.c 文件中第 53 行代码在程序运行时的地址范围,从 main 函数的偏移量为 41 的位置开始,到 main 函数的偏移量为 53 的位置结束。...查看断点信息 info b info b 与 i b等价 前面我们知道进入函数单步执行用到的gdb指令是 s 退出函数用到的gdb指令是 finish finish finish 不与 f等价 finish
所以,本文的约定是:在编写程序的过程中,使用到的功能才会进行详细介绍。 简易的 GDB 我们要实现一个有如下功能的 GDB: 可以对一个可执行程序进行调试。 可以在调试程序时,设置断点。...可以在调试程序时,打印程序的信息。 下面主要围绕这三个功能进行阐述。 1. 调试可执行文件 我们使用 GDB 调试程序时,一般使用 GDB 直接加载程序的可执行文件,如下命令: $ gdb ....*/ instr = ptrace(PTRACE_PEEKTEXT, debug_pid, regs.rip, 0); /* 打印当前执行中的指令信息 */...来获取某个内存地址的值。 5. 通过调用 ptrace(PTRACE_SINGLESTEP...) 将被调试进程设置为单步调试模式,这样当被调试进程每执行一条指令,都会进入停止状态。...可见,运行 ls 这个命令需要执行 40 多万条指令。 总结 本文简单介绍了调试器的执行流程,当然这个调试器暂时并没有什么作用。
gdb attach pid: 通过”绑定“进程ID来调试正在运行的进程 gdb filename -c coredump_file: 调试可执行文件 在下面的几节中,将分别对上述几种调试方式进行讲解...frame 栈帧用来存储函数的变量值等信息,默认情况下,GDB总是位于当前正在执行函数对应栈帧的上下文中。 在前面的例子中,由于当前正在print()函数中执行,GDB位于第0帧的上下文中。...ptrace(PTRACE_TRACEME, 0, 0, 0)操作 在子进程中通过execv()系统调用加载指定的可执行文件 attach运行的进程 可以通过gdb attach pid来调试一个运行的进程...然后用保存的指令替换int 3并等待操作恢复。 命中判断 gdb将所有断点位置存储在一个链表中。命中判定将被调试程序的当前停止位置与链表中的断点位置进行比较,以查看断点产生的信号。...不是在条件断点处插入 int 3,而是插入另一条指令。当程序到达这个地址时,不是发出int 3信号,而是进行比较。特定寄存器的内容和某个地址,然后决定是否发送int 3。
理解编译链接的过程和ELF可执行文件格式 五、编程使用exec*库函数加载一个可执行文件,动态链接分为可执行程序装载时动态链接和运行时动态链接 六、使用gdb跟踪分析一个execve系统调用内核处理函数...(如打开的文件、挂起的信号、进程状态、地址空间等等)的总称。...将ret_from_fork的地址设置为eip寄存器的值,这是子进程的第一条指令。...在使用静态库的情况下,在编译链接可执行文件时,链接器从库中复制这些函数和数据并把它们和应用程序的其它模块组合起来创建最终的可执行文件(.EXE文件)。...新的可执行程序通过修改内核堆栈 eip 作为新程序的起点,从 new_ip 开始执行后start_thread把返回到用户态的位置从 int 0x80 的下一条指令变成新加载的可执行文件的入口位置。
静态链接 / 动态链接的可执行文件的第一条指令地址 静态链接可执行文件的第一条指令地址 我们之前提到过,静态链接的可执行文件的其实地址就是本文件的_strat,即readelf -h所得到的的起始地址。...我们用readelf -h查看其入口地址,并在gdb中starti查看它实际的第一条指令的地址: 可以看到,与我们的预期是一致的,确是是从文件本身真正的入口地址entry point0x400a50开始执行第一条指令...当 ld 将外部符号的地址都确定好之后,才将指令指针执行程序本身的_start。也就是说,在动态链接的可执行文件中,第一条指令应该在链接加载器 ld 中。...这就验证了我们上面的说法:动态链接的可执行文件的第一条指令是链接加载器的程序入口,它会完成外部符号地址的绑定,然后将控制权交还给程序本身,开始执行。...而在链接静态库时,链接器会把静态库中的目标文件取出来和可执行文件真正链接在一起。 静态库链接后,指令由相对地址变为绝对地址,各段的加载地址定死了。
Golang 代码被操作系统运行起来的流程 一、编译 go 源代码首先要通过 go build 编译为可执行文件,在 linux 平台上为 ELF 格式的可执行文件,编译阶段会经过编译器、汇编器、链接器三个过程最终生成可执行文件...$ go build -gcflags "-N -l" -o main main.go $ gdb ....(gdb) n 16 LEAQ 8(SP), SI // argv (gdb) n 17 JMP runtime·rt0_go(SB) (gdb) n runtime.rt0_go () at /home....s 文件中的第 8 行,最终会执行 CALL runtime·mstart(SB) 指令后输出 “hello world” 然后程序就退出了。...调试已经看到了 golang 程序在启动过程中会执行一系列的汇编指令,本节会具体分析启动程序过程中每条指令的含义,了解了这些才能明白 golang 程序在启动过程中所执行的操作。
领取专属 10元无门槛券
手把手带您无忧上云