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

代码写得差就怪 GDB

很多人想当然地觉得代码就会按预期的流程去执行,但是实际上一到生产环境总会出现这样那样的问题,这是很多 Bug 产生的原因。在调试的过程中,能够学到很多可能想不到的知识。...有些面试者对各种开发工具都不熟悉,我猜想这类应聘者应该是基本“不写代码”或者“不会写代码”的,面试结果可想而知。...虽然 Linux 系统下大家编写 C/C++ 代码的 IDE 可以自由选择,但是调试生成的 C/C++ 程序一定是直接或者间接使用 GDB。...02 熟练使用 GDB 是学习优秀开源项目的一把钥匙 一些初中级开发者可能想通过阅读一些优秀的开源项目来提高自己的编码水平,但是只阅读代码,不容易找到要点,或者会误解程序的执行逻辑,最终迷失方向。...简而言之,GDB 调试是学习这些优秀开源项目的一把钥匙。 另外,由于 C++ 这门语言多态特性的存在,我们看到的代码执行脉络和实际中的执行流程可能会不一样,特别容易搞错。

73800
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

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

    对于恶意程序而言,他们会特意在代码中穿插一些数据,这样就能干扰反汇编工具,使得安全人员很难对其进行准确的分析。 接下来我们看看递归反汇编。...左边是一段c语言代码,右边是对应的反汇编指令,左边C语言的逻辑很简单,它遍历一个数组,检测每个元素值,如果它满足一些条件就直接忽略,满足一些条件就返回它对应下标,满足另一些条件就调用fatal函数后退出...由于静态反汇编面临一系列困难,因此我们需要动态反汇编的帮助。它的基本思路是将代码运行起来,在运行中设置断点,然后从暂停处进行反汇编,就像前面我们用过的那样。...显然在linux上,最常用的动态反汇编莫过于使用gdb了,我们看一个例子,启动linux系统,然后执行gdb /bin/ls 也就是动态反汇编ls命令程序,然后执行命令info files,该命令会显示在运行...,如果代码中包含逻辑炸弹,也就是某些恶意指令只能在某个时间点过后才执行,那么动态反汇编就找不出这些恶意代码

    2.7K20

    使用gdb调试程序

    g++ test.cpp -g -o test gdb test #调试程序 gdb test -tui #显示代码窗口 另一种方式: gdb #启动gdb file test #用file命令来启动对...delete(不好用啊) d #删除所有断点,delete也可以(可能会用到) clear #删除某行断点(好用) i b #查看断点 运行程序 r #run的简写 list #显示代码...,如果显示不全再点个回车 list 行号 #显示以该行为中心的一段代码 控制调试进程 n #单步执行,不跳入函数,next的简写(vs中F10) s #真正的单步执行,跳入函数,step(vs中F11)...layout regs #显示源码\反汇编\寄存器窗口 layout split #显示源码和反汇编窗口 调试coredump core文件相关设置 #查看资源相关限制信息 ulimit -a #...#跳转到1号栈帧 f 1 #打开该帧函数的反汇编代码 disassemble 调试多线程 几个常用命令 #打印线程信息 info threads #查看所有线程的堆栈信息 thread apply

    69710

    gdb基础命令和常用操作补充

    set disassembly-flavor intel # 设置反汇编格式 disassemble可以反汇编当前函数或者指定的函数,单独用disassemble命令是反汇编当前函数,如果disassemble...命令后面跟函数名或地址则反汇编指定的函数。...4.前面讲过step命令可以一行代码一行代码地单步调试,而这里用到的si/ni命令可以一条指令一条指令地单步调试。 info registers可以显示所有寄存器的当前值。...启动和查看程序 setargs 设置程序运行参数 run运行程序,使用方式如:r   List  显示程序源代码命令,使用show listsize 查看显示代码的行数   list <...(gdb) call test("abc") 使用 "--tui" 参数,可以在终端窗口上部显示一个源代码查看窗。

    3K00

    GDB更方便的代码调试工具:CGDB

    有 bug 的示例代码 GDB 调试操作 CGDB 调试操作 别人的经验,我们的阶梯! CGDB 是GDB的前端,在终端窗口中意图形化的形式来调试代码(基于ncurse),非常方便。...编译测试代码:gcc -g test.c -o test 因为要使用GDB调试,所以别忘了加上-g选项。 GDB 调试操作 $ gdb ....问题是解决了,但是回过头来看一下gdb的调试过程,还是比较繁琐的:调试指令和代码显示夹杂在一起,需要敲很多指令。...+ f:代码向下翻一页; ctrl + d:代码向下翻半页; 按下i键回到调试窗口,进入调试模式,使用的调试指令与GDB几乎一样!...也就是说:可以在实时查看代码的情况下进行调试操作,大大提高了效率。 我们按照上面GDB的调试过程走一遍: 按下ESC键进入代码窗口,此时代码前面的行号如果是白色的,表示所在的当前行。

    1.6K30

    GDB使用详解

    一、打开GDB 1、gdb filename 加载该文件到gdb 2、gdb file filename 如果gdb filename失败,可以在打开gdb以后,通过file来加载调试文件 3、gdb...二、常见命令 l(list):显示代码,list 行号:将显示当前文件以“行号”为中心的前后10行代码,如:list 12,list 函数名:将显示“函数名”所在函数的源代码,如:list main...(55); layout:用于分割窗口,可以一边查看代码,一边测试; layout src:显示源代码窗口; layout asm:显示反汇编窗口; layout regs:显示源代码/反汇编和CPU寄存器窗口...; layout split:显示源代码反汇编窗口; display: 在每次单步进行指令后,紧接着输出被设置的表达式及值; stepi或nexti:单步跟踪一些机器指令; Ctrl + L:刷新窗口...; quit:简记为 q ,退出gdb; 回车:重复上一条命令; 执行下一步操作,注意命令行此时显示的并不是当前执行的操作,而是下一次要执行的。

    6.9K100

    定位Oops的具体代码

    注意这行:                 EIP is at list_del+0xa/0x61            这告诉我们,list_del函数有0x61这么大,而Oops发生在0xa...看,gdb直接就告诉你在哪个文件、哪一行了。            ...: TIPS            如果在lkml或bugzilla上看到一个Oops,而自己不能重现,那就只能反汇编以"Code:"开始的行。...注意,这时候就可以反汇编0x80484e0这个地址:                 (gdb) disassemble 0x80484e0                 Dump of assembler...补充: 为了使汇编代码和C代码更好的对应起来, Linux内核的Kbuild子系统提供了这样一个功能: 任何一个C文件都可以单独编译成汇编文件,例如: make path/to/the/sourcefile.s

    1.1K20

    深入理解计算机系统前篇总结

    、机器学习; 博主寄语:感谢各位技术友的支持,您的支持就是我前进的动力 ; ‘’ 特别鸣谢:木芯工作室 、Ivan from Russia ---- 文章目录 概念梳理 小知识点 汇编详解 gdb...的使用 反汇编器 objdump ---- 概念梳理 小知识点 32位最大支持4GB内存 x86的32位架构一般又被称作IA-32,全名为“Intel Architecture, 32-bit”。...gcc指令常用方式 -o wodeexe 指定输出文件名字 -Og 指定优化等级为低 helloworld.c c文件 x86-64 高16位必须为0 汇编详解 编译: compile以后就是汇编代码...:Ubuntu”… 点开头的信息不用管 都是给汇编器和链接器的伪指令 gdb的使用 可以载入 一个二进制目标代码就是.obj的程序 然后gdb hello.o 然后查看x/14xb 某个函数 反汇编器...objdump objdump -d hello.o 注意:反汇编只是用 obj目标代码来确定汇编代码 不需要访问 源代码或汇编代码

    25720

    什么是Canary保护

    本次实验教学代码如下: 实验目的,对比有无Canary保护的程序有何不同 gcc -m32 -no-pie -fno-stack-protector -o canary canary.c -m32...(gdb) until 或(gdb) u 指定程序直到退出当前循环体这里,发现需要把光标停止在循环的头部,然后输入u这样就自动执行全部的循环了。...另外,跳转不会改变当前的堆栈内容,所以跳到别的函数中就会有奇怪的现象,因此最好跳转在一个函数内部进行,跳转的参数也可以是程序代码行的地址,函数名等等类似list。...disas addr 查看addr处前后的反汇编代码 disas functions 参看fucntion函数的反汇编代码 p 系列 p system/main 显示某个函数地址 p $...如果有符号表会加载符号表 x/x $esp 查看esp寄存器中的值 x/s addr 查看addr处的字符串 x/b addr 查看addr处的字符 x/i addr 查看addr处的反汇编结果

    13410

    告诉大家代码重构有什么好处

    这是一种清理代码的严格方法,可以最大限度地减少引入错误的机会。本质上,当你重构时,你是在改进编写代码后的设计。” ◆ 重构有什么好处?      源代码重构提供了许多优势。...它将混乱、不正确和/或重复的代码变成干净的代码。它解决了多个开发人员贡献自己的代码时可能出现的标准化问题。重构提供了更高的可读性并提高了源代码的可维护性以及整体结构和功能。...这应该包括更小的代码大小和更易于理解的代码。 ◆ 代码重构示例 代码重构的例子有很多,但为简洁起见,我们将重点介绍几个: 红色、绿色、重构 重构与单元测试密切相关。...这消除了在尝试合并代码时可能出现问题的分支上重构代码的复杂性。 组合方法 过长的代码难以理解且难以更改。Compose 方法是指可用于简化方法和删除代码重复的一系列操作。...询问您的团队哪些代码最妨碍他们的工作效率。 什么代码修复会对您的其他代码产生最大的影响? 哪些修复将提供最大的回报?

    1.1K20

    CC++生态工具链——GDB调试器

    GDB的功能很强大,开发者可以在执行时修改函数变量的值以及程序的执行顺序,还可以在程序执行期间查看函数的调用过程、堆栈数据等,也可以利用GDB代码进行断点调试。...二,两种常见编译模式:Debug模式 & Release模式 Debug模式: 代码在编译时会显示出完整的调试信息以定位问题,编译期间可以查看程序的运行时信息,且编译期间不考虑对代码的执行进行优化。...Release模式: 代码在编译时不会显示调试信息,并且编译期间会优化代码的执行。生成的可执行文件执行速度较快。 GDB主要在Debug模式下进行使用。.../demo -tui"执行结果: 四,GDB的主要语法 1.查看运行信息的指令 命令全称(命令缩写) 具体含义 show 显示调试器本身的信息 info 显示被调试的程序信息 list 显示源代码...disass 对函数等进行反汇编 disassemble 对地址进行反汇编 directory(dir) 设置执行路径 set 设定运行的参数 signal 向被调试程序发信号 handle 设置信号对应的操作

    1.6K20

    全志D1s裸机开发之体验第一个程序

    benos了 (gdb) symbol-file benos.elf // 读取benos.elf的符号表,否则你调试时无法知道函数、代码等信息 Load new symbol table from...// 单步执行并进入函数,每次执行一条汇编语句 (gdb) symbol-file benos.elf // 读取benos.elf的符号表,否则你调试时无法知道函数、代码等信息 (gdb) si...列出所有寄存器的值 (gdb) l // 列出代码 (gdb) l (gdb) c // 继续执行 Program received signal SIGINT, Interrupt....要同时显示源码和寄存器,可以执行如下 2 个命令: layout src layout regs 要同时显示反汇编码和寄存器,可以执行如下 2 个命令: layout asm layout regs 要同时显示源码和反汇编码...,可以执行如下命令: layout split 使用 TUI 模式时,只是方便我们观看源码、反汇编码、寄存器,具体操作还是在命令窗口输入 GDB 命令,请参考《2.2.4 命令行调试示例》。

    25710

    arm裸板驱动总结(makefile+lds链接脚本+裸板调试)

    首先lds链接脚本的作用就是将多个*.o文件的各个段链接在一起,告诉链接器这些各个段存放的地址先后顺序,它的好处就是,确保裸板2440的前4k地址里存放的是初始化SDRAM,nandflash的内容 1...nand.dis文件 //-D :反汇编nand.bin里面所有的段, -m arm:指定反汇编文件的架构体系,这里arm架构 %.o:%.c //冒号前面的是目标文件,冒号后面的是依赖文件...对JATG实现源码级别的调试  在linux中,使用arm-linux-gdb软件 在win7中,则使用arm-none-eabi-gdb软件 使用GDB工具,就不需要像上个OCD调试那么麻烦了 1)比如说...,想在“int i=0;”处打上断点: OCD调试: 就需要查看调试的反汇编文件,找到i=0所在的运行地址,然后通过命令在地址上打断点 GDB调试: 则可以直接在i=0处的源码上打断点,后台会通过带调试信息的编译文件...,GDB最终转换为命令行,再调用OCD来实现调试,如下图所示)

    1.4K90

    学会一个JVM插件:使用HSDIS反汇编JIT生成的代码

    HSDIS是一个Java官方推荐 HotSpot虚拟机JIT编译代码反汇编插件。...我们有了这个插件后,通过JVM参数-XX:+PrintAssembly就可以加载这个HSDIS插件,然后为我们把JIT动态生成的那些本地代码还原成汇编代码,然后打印出来。...根据不同的操作系统下载对应的版本,本文的代码是运行在Mac上的,所以选择hsdis-amd64.dylib。...runtime_call} 0x00000001037b3bcd: hlt 0x00000001037b3bce: hlt 0x00000001037b3bcf: hlt 为什么要做反汇编呢...分析程序还可以通过一些调试工具来搞,比如GDB、Windbg来断点调试,但断点调试无法触及到JIT生成的本地代码,所以这时候就只能通过反汇编JIT代码来分析代码运行的底层情况了。

    6K2312

    linux下gdb调试方法与技巧整理「建议收藏」

    (gdb) 到此gdb启动完成! 2、查看源码 list(简写 l): 查看源程序代码,默认显示10行,按回车键继续看余下的。...(可以带上代码路径和代码名称: b OAGUPDATE.cpp:578) b fn1 if a>b:条件断点设置 break func(break缩写为b):在函数func()的入口处设置断点,...list 行号:将显示当前文件以“行号”为中心的前后10行代码,如:list 12 list 函数名:将显示“函数名”所在函数的源代码,如:list main list :不带参数,将接着上一次 list...6、分割窗口 layout:用于分割窗口,可以一边查看代码,一边测试: layout src:显示源代码窗口 layout asm:显示反汇编窗口 layout regs:显示源代码/反汇编和CPU...寄存器窗口 layout split:显示源代码反汇编窗口 Ctrl + L:刷新窗口 7、cgdb强大工具 cgdb主要功能是在调试时进行代码的同步显示,这无疑增加了调试的方便性,提高了调试效率

    2.4K20

    linux常用命令--开发调试篇

    打印elf文件中的可打印字符串--strings 例如你在代码中存储了一个版本号信息,那么即使编译成elf文件后,仍然可以通过strings搜索其中的字符串甚至可以搜索某个.c文件是否编译在其中: strings...有时候我们需要反汇编来定位一些问题,可以使用命令: objdump -d cmdTest #反汇编整个cmdTest程序 但是如果程序较大,那么反汇编时间将会变长,而且反汇编文件也会很大。...如果我们已经知道了问题在某个函数,只想反汇编某一个函数,怎么处理呢?...gdb是一个强大的调试工具,但这里仅介绍两个简单使用示例。...有时候程序可能已经正在运行,但是又不能终止它,这时候仍然可以使用gdb调试正在运行的进程: gdb processFile PID #processFile为进程文件,pid为进程id,可通过ps命令查找到

    1.5K30

    Linux后台开发调试经验分享

    很难有人保证自己写的代码一行错误都没有,有问题你就要查。怎么查?高手者,反汇编,看 2 进制;low 一点的就 gdb、看统计;再 low 就加打印。还可以再 low 吗?...功能调试阶段 调试的手段很多,走读代码,打日志,gdb,统计,coredump 等,如果有精力也可以搞搞的白盒测试什么的。测试的意图也很明显,确认代码是否按照正确的编码意图在运行!...理解其他的人写的代码途径也就是通过阅读代码了解大致思路,通过日志、gdb、或者统计信息补充代码意图的更多细节,或者修正理解不对的思路。...这个过程可能很枯燥,也可能很有挑战,试图通过种种迹象去了解另外一个程序员写代码的初衷和意图,会不会有窥探人家隐私的赶脚! 其实,上面说了这么多只是告诉大家调试好的前提,和调试的初衷。...直接告诉测试的兄弟,帮忙执行以下软调,将收集的日志给他分析一下就可以解决问题。 2) 关于 gdb 还有大牛说过:“我就是程序,程序就是我”。我常用 gdb 来检验自己对程序的理解。

    59930
    领券