首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Linux下C++命令行调试实战

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将执行我们最后一次输入指令,所以我们可以一直按回车键继续让程序单步执行。

3.1K20

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.4K20
您找到你想要的搜索结果了吗?
是的
没有找到

Linux下GDB调试器常用指令

本文是该系列第三篇文章,你可以通过以下链接查看过去内容 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-nn行开始查看代码。...gdb 进行调试,例如:gcc -g main.cpp -o main 回车键:重复上一命令 > 本文来自自己学习笔记

1.7K20

linux与g++基本知识「建议收藏」

gcc是GCCGUN C Compiler(C 编译器) g++是GCCGUN C++ Compiler(C++编译器) gdb是是GCCGUN 调试工具 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-nn行开始查看代码 list+函数名 查看具体函数) set #设置变量值 next(n) #单步调试(越过函数) step

1.3K50

Linux基础——Linux开发工具()_gccg++

函数库 函数库一般分为静态库和动态库两种: 静态库是指编译链接时,把库文件代码全部加入到可执行文件,因此生成文件比较大,但在运行时也 就不再需要库文件了。...其后缀名一般为.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:查看已打断点信息

13710

【Linux系统编程】Linux调试器——gdb 基本使用

但是如何在Linux上调式代码我们还不知道,所以今天要学是Linux调试器——gdb 基本使用。 1. 准备工作及知识补充 那要使用调式器调式,首先我们得有代码,有可执行程序。...我们说了Linux调式器是gdb,那如何使用gdb调式 如果你机器上没有gdb可以先安装一下:sudo yum install -y gdb 然后调式的话,第一步直接gdb+可执行文件名...然后我们输入相应指令去调式的话,会发现调不成,有一个报错说是找不到调试符号 其实就是生成可执行程序没有调式信息,怎么回事?...Debug 配置通常会禁用一些优化,以便在调试过程能够更好地观察程序行为。 此配置构建速度较慢,生成可执行文件较大。...n/next:逐过程 那逐语句呢? 我们重新开始调式 然后又停到了16行 那我现在想进入函数怎么做?

27410

Linux从入门到精通(九)——Linux编程

进入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,没有跟文件名,可以通过这个调入想要调试可执行文件

2K30

反汇编与二进制分析一些基本知识

常用反汇编工具一般需要执行三个步骤,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 动态反汇编只能让我们解析程序运行经过指令

2.6K20

补充实验:GDB调试

创建工作目录 目录命名为班级加姓名格式, 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操作引发了异常。

56000

Linux下gdb安装及使用入门

-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寄存器值。

6.3K10

用图文带你彻底弄懂GDB调试原理

我们都知道,在使用gcc编译时,可以使用-g选项在可执行文件嵌入更多调试信息,那么具体嵌入了哪些调试信息?这些调试信息是如何与二进制指令之间进行相互交互?...在调试窗口输入设置断点指令“break 5”,此时gdb做2件事情: 对5行源码所对应10行汇编代码存储到断点链表。...在汇编代码10行,插入中断指令INT3,也就是说:汇编代码10行被替换为INT3。 ?...此刻,就相当于下一执行指令是汇编代码10行,也就是源码5行。...gdb在接收到next执行时,会计算出7行源码,应该对应到汇编代码14行,于是gdb就控制汇编代码PC指针一直执行,直到13行执行结束,也就是PC指向14行时,就停止下来,然后继续等待用户输入调试指令

5.1K53

6_Makefile与GCC

其中: ​ 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 ​ 我们将上面一命令变成了四,分别编译成源文件目标文件,最后再将所有的目标文件链接成可执行文件

3.5K10

GDB调试技巧】提高gdb调试效率

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

12810

自己动手写一个GDB|基本功能

所以,本文约定是:在编写程序过程,使用到功能才会进行详细介绍。 简易 GDB 我们要实现一个有如下功能 GDB: 可以对一个可执行程序进行调试。 可以在调试程序时,设置断点。...可以在调试程序时,打印程序信息。 下面主要围绕这三个功能进行阐述。 1. 调试可执行文件 我们使用 GDB 调试程序时,一般使用 GDB 直接加载程序可执行文件,如下命令: $ gdb ....*/ instr = ptrace(PTRACE_PEEKTEXT, debug_pid, regs.rip, 0); /* 打印当前执行指令信息 */...来获取某个内存地址值。 5. 通过调用 ptrace(PTRACE_SINGLESTEP...) 将被调试进程设置为单步调试模式,这样当被调试进程每执行一指令,都会进入停止状态。...可见,运行 ls 这个命令需要执行 40 多万指令。 总结 本文简单介绍了调试器执行流程,当然这个调试器暂时并没有什么作用。

1.1K40

GDB调试-从入门实践到原理

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。

2.5K30

分析Linux系统执行过程

理解编译链接过程和ELF可执行文件格式 五、编程使用exec*库函数加载一个可执行文件,动态链接分为可执行程序装载时动态链接和运行时动态链接 六、使用gdb跟踪分析一个execve系统调用内核处理函数...(打开文件、挂起信号、进程状态、地址空间等等)总称。...将ret_from_fork地址设置为eip寄存器值,这是子进程第一指令。...在使用静态库情况下,在编译链接可执行文件时,链接器从库复制这些函数和数据并把它们和应用程序其它模块组合起来创建最终可执行文件(.EXE文件)。...新可执行程序通过修改内核堆栈 eip 作为新程序起点,从 new_ip 开始执行后start_thread把返回到用户态位置从 int 0x80 下一指令变成新加载可执行文件入口位置。

89320

含大量图文解析及例程 | Linux下ELF文件、链接、加载与库(下)

静态链接 / 动态链接可执行文件第一指令地址 静态链接可执行文件第一指令地址 我们之前提到过,静态链接可执行文件其实地址就是本文件_strat,即readelf -h所得到起始地址。...我们用readelf -h查看其入口地址,并在gdbstarti查看它实际第一指令地址: 可以看到,与我们预期是一致,确是是从文件本身真正入口地址entry point0x400a50开始执行第一指令...当 ld 将外部符号地址都确定好之后,才将指令指针执行程序本身_start。也就是说,在动态链接可执行文件,第一指令应该在链接加载器 ld 。...这就验证了我们上面的说法:动态链接可执行文件第一指令是链接加载器程序入口,它会完成外部符号地址绑定,然后将控制权交还给程序本身,开始执行。...而在链接静态库时,链接器会把静态库目标文件取出来和可执行文件真正链接在一起。 静态库链接后,指令由相对地址变为绝对地址,各段加载地址定死了。

1.3K22

Golang 程序启动流程分析

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 程序在启动过程中所执行操作。

1.3K10
领券