GDB调试:从入门到入土】的更多相关文章

你好,我是雨乐! 在上篇文章中,我们分析了线上coredump产生的原因,其中用到了coredump分析工具gdb,这几天一直有读者在问,能不能写一篇关于gdb调试方面的文章,今天借助此文,分享一些工作中的调试经验,希望能够帮到大家. 写在前面 在我的工作经历中,前几年在Windows上进行开发,使用Visual Studio进行调试,简直是利器,各种断点等用鼠标点点点就能设置:大概从12年开始转Linux开发了,所以调试都是基于GDB的.本来这篇文章也想写写Windows下调试相关,奈何好多年…
编译指令 gcc test.c -o test -g -g是加入调试信息,加入源码信息 启动gdb调试 gdb test 进入gdb中 设置参数 set args 10 20 显示参数show ager 退出 q quit 帮助 help set查看set帮助文档 list n 显示源码,从第n行开始 一次显示十行 回车是默认上次的命令. lsit mian查看函数 list默认显示main函数 list file.cpp:n 查看指定文件的行号 list file.cpp:def 查看指定文件…
作者:良知犹存 转载授权以及围观:欢迎添加微信号:Conscience_Remains 总述     今天我们介绍一下core dump文件,Core dump叫做核心转储,它是进程运行时在突然崩溃的那一刻的一个内存快照.操作系统在程序发生异常而异常在进程内部又没有被捕获的情况下,会把进程此刻内存.寄存器状态.运行堆栈等信息转储保存在一个文件里. 该文件也是二进制文件,可以使用gdb.elfdump.objdump或者windows下的windebug.solaris下的mdb进行打开分析里面的…
没有使用过gdb调试过程序的觉得gdb是个很神奇的东东,如果你使用它调试一次保证你想忘记它都难,下面看看它的庐山真面目吧! GDB概述 GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具.或许,各位比较喜欢那种图形界面方式的,像VC.BCB等IDE的调试,但如果你是在UNIX平台下做软件,你会发现GDB这个调试工具有比VC.BCB的图形化调试器更强大的功能.所谓“寸有所长,尺有所短”就是这个道理. 一般来说,GDB主要帮忙你完成下面四个方面的功能: 1.启动你的程序,可以按照你的自定…
引用自:http://blog.jobbole.com/107759/ gdb 调试 ncurses 全过程: 发现网上的“gdb 示例”只有命令而没有对应的输出,我有点不满意.gdb 是 GNU 调试器,Linux 上的标配调试器.当我看 Greg Law 在 CppCon 2015 上的演讲<给我 15 分钟,我将改变你的对 GDB 的认知>的时候,我想起了示例输出的不足,幸运的是,这次有输出!这 15 分钟太值了. 它也启发我去分享一个完整的 gdb 调试实例,包含输出和每个步骤,甚至钻…
addr2line有什么作用呢? 可别小瞧它, 它能够定位到代码出错的位置. 以下, 我们来看看这个简单的代码: #include <stdio.h> int main() { int *p = NULL; *p = 0; printf("bad\n"); return 0; } 这个程序非常小, 我们能够一眼就看出程序在执行期出错. 可是, 假设是大程序, 在执行期出错. 我们该怎样定位呢?  那就必须依赖于工具. 而不是你我的肉眼. 我们以上述小程序为例, 进行例如以下…
一.什么是gdb:gdb是GNU debugger的缩写,是编程调试工具二.gdb功能:1.启动程序,可根据用户要求随心所欲的运行程序(比如带参数)2.可让被调试的程序在用户指定的调试的断点处停住3.当个程序停住,可以检查程序中发生的事(比如打印变量值)4.动态改变变量程序的执行环境三.使用实例:gcc -Wall -g mian.c -o simple   注意:需要加上-g选项,以便生成调试信息.方便gdb调试,如果不加,只显示汇编代码,没有源文件代码.gdb simple #启动gdb(g…
GDB调试主要包括: 1.查看运行时数据 2.程序错误 3.gdb调试逻辑错误 4.gdb调试段错误 5.core文件调试 一.查看运行时数据 1.print 查看变量值 2.ptype 变量: 查看数据类型 3.print array(数组名):  查看数组 4.print *array@len(p *arr2@10 查看动态内存10个元素内容):  查看动态内存(malloc分配的内存),静态数组也可以这么查看 5.print  i=5 : 改变运行时数据 二.程序错误 1.编译错误:编写程…
作者:良知犹存 转载授权以及围观:欢迎添加微信号:Conscience_Remains 总述 在window下我们习惯了IDE的各种调试按钮,说实话确实挺方便的,但到了Linux下,没有那么多的IDE支持我们调试,但是Linux有也有强大的命令行C/C++的调试工具--GDB,GNU提供的开源调试工具. 刚开始不习惯,使用多了我们就会喜欢上他,程序调试的单步执行,跳入函数,跳出函数,设置断点,设置观察点,查看变量.GDB都有,此外gdb还可以生成程序非法执行后core dump文件,这个文件有快…
本文转载自:https://blog.csdn.net/newjay03/article/details/72835758 本来打算完全在Ubuntu下开发的,但是水平有限,没有在Ubuntu下找到合适的阅读大型代码的工具,所以不得不在windows搭建开发环境. 一.主要内容: 1.在windows10下搭建arm(s3c2440)开发环境 在win10下使用vmware workstation12 pro建立Ubuntu主机,而后在Ubuntu中配置arm交叉编译链.在win10下编写代码,…
http://www.wuzesheng.com/?p=1327 手把手教你玩转GDB(一)——牛刀小试:启动GDB开始调试 写在最前面:GDB是unix相关操作系统中C/C++程序开发必不可少的工具,它的功能之强大,是其它调试器所不能匹敌的.但是,现实的工作中,有很多开发者因为GDB本身入门门槛比较高,而被拒之门,与如此强大的失之交臂.笔者在近两年的C/C++开发工作中,对GDB本身的有一点研究,在这里总结出一系列<手把手教你玩转GDB>的文章,一方面权当是对自己经验的一个总结,一方面也是真…
上篇(使用c++开发跨平台程序)说到,我不怕造东西,我怕的是造出来的东西,如果出了问题,我却不知道原因.所以调试分析是一个重要的手段. C++调试是一个复杂的活.虽然大部分调试可以通过IDE在开发期间就解决了.但是必然的,还有很多东西需要在生产环境中还原它.分析它,然后解决它.gdb是一个成熟的工具.围绕着它有很多的工具可以选择.不过这么多工具的根本还是命令行模式下的gdb. 废话不多说,现在我就用gdb来分析调试一下吧. 生成dump文件: 在shell中输入命令: ulimit -c unl…
引言 24岁的某天,承载着周围人的关心,一路南下.天晴心静,听着斑马,不免对未来有些彷徨.但是呢,人生总要走陌生的路,看陌生的风景,所幸可以听着不变的歌,关心自己的人就那么多.就像是对庸常生活的一次越狱,路才刚刚开始.... - 2021.7.12 Qt5.14.2安装教程 步入公司,因需要学习Qt,本文主要整理为Qt的学习记录,从入门到入土,纯干货,尽可能详细. 一,Qt简介 Qt(官方发音 [kju:t],音同 cute)是一个跨平台的 C++ 开库,主要用来开发图形用户界面(Graphic…
1.启动调试 前置条件:编译生成执行码时带上 -g,如果使用Makefile,通过给CFLAGS指定-g选项,否则调试时没有符号信息.gdb program //最常用的用gdb启动程序,开始调试的方式gdb program core //用gdb查看core dump文件,跟踪程序core的原因gdb program pid //用gdb调试已经开始运行的程序,指定pid即可gdb attach pid //用gdb调试已经开始运行的程序,指定pid即可 2.调试命令(1)执行命令模式-bat…
GDB调试汇编堆栈过程分析 分析过程 这是我的C源文件:click here 使用gcc - g example.c -o example -m32指令在64位的机器上产生32位汇编,然后使用gdb example指令进入gdb调试器: 进入之后先在main函数处设置一个断点,再run一下,使用disassemble指令获取汇编代码,用i(info) r(registers)指令查看各寄存器的值: 可见此时主函数的栈基址为0xffffd068,用x(examine)指令查看内存地址中的值,但目前…
想要使用gdb调试程序的话,首先需要gcc -g main.c -o test 然后运行gdb test对程序进行调试 l (小写的l,是list的首字母),用以列出程序 回车    是运行上一个命令 b func    可以设置到func函数的断点 info break 可以用来查看断点 r    (run的首字母)运行程序 n     (next首字母)下一步,单步调试,不会进入函数内 watch  i    用以设置观察点,可以通过info break 查看断点后,删除相应的观察点处设置的…
GDB调试汇编堆栈过程分析 测试代码 #include <stdio.h> short val = 1; int vv = 2; int g(int xxx) { return xxx + vv; } static const int f(int xx) { return g(xx); } int main(void) { return f(9)+ val; } 分析过程 通过gcc - g gdb.c -o gdb -m32指令在64位的机器上产生32位汇编 进入gdb调试,先在main函数…
有时候,使用PHP的第三方扩展之后,可能会发生一些错误,这个时候,可能就需要更底层的方式追踪调试程序发生错误的地方和原因,熟悉linux下C编程的肯定不陌生gdb 首先,使用ulimit -c命令,查看系统是否会生成 core文件. #返回结果可能是0 ulimit -c 当返回结果为0时,说明系统不会生成core文件,这个时候使用ulimit -c命令改变系统的默认设置 ulimit -c unlimited #或者 ulimit -c n #n大于0的数字 这样当程序运行错的时候,就会把运行…
gdb调试汇编堆栈过程的学习 以下为C源文件 使用gcc - g code.c -o code -m32指令在64位的机器上产生32位汇编,然后使用gdb example指令进入gdb调试器: 进入之后先在main函数处设置一个断点,再run一下,使用disassemble指令获取汇编代码,用i(info) r(registers)指令查看各寄存器的值: 可见此时主函数的栈基址为0xffffd058,用x(examine)指令查看内存地址中的值,但目前%esp所指堆栈内容为0,%ebp所指内容也…
·代码(实验楼中的代码,改了部分数值)命名为test.c int g(int x) { return x + 7; } int f(int x) { return g(x); } int main(void) { return f(3) + 5; } ·在64位的机器上产生32位汇编(使用指令为:gcc - g test.c -o test -m32),然后使用gdb test指令进入gdb调试器,进入后在main这里设置一个断点,然后运行: · ·使用指令:disassemble获取汇编代码,…
20145223<信息安全系统设计基础> GDB调试汇编堆栈过程分析 分析的c语言源码 生成汇编代码--命令:gcc -g example.c -o example -m32 进入gdb调试,先在main函数处设置一个断点,再run一下,使用disassemble指令获取汇编代码: 通过info registers查看使用的寄存器: 此时主函数的栈基址为0xffffd038,用x(examine)指令查看内存地址中的值,目前%esp所指堆栈内容为0,%ebp所指内容也为0: Step6:使用d…
GDB调试汇编堆栈 分析过程 C语言源代码 int g(int x) { return x+6; } int f(int x) { return g(x+1); } int main(void) { return f(5)+1; } 使用gcc -g exp1.c -o exp1 -m32指令在64位机器上产生32位汇编. 进入gdb调试器. 在main函数处设置一个断点. 使用run指令开始运行程序,返回main函数运行的结果. 使用disassemble指令获取汇编代码. 使用info re…
GDB调试汇编堆栈过程分析 使用gcc - g example.c -o example -m32指令在64位的机器上产生32位汇编,然后使用gdb example指令进入gdb调试器: 使用gdb调试代码. 使用break main指令在main函数处设置断点,然后调试,直到mian函数处. 使用diassemble指令获取汇编代码 查看内存地址中的值,但目前%esp所指堆栈内容为0,%ebp所指内容也为0 使用命令display /i $pc每次程序中断后可以看到即将被执行的下一条汇编指令…
GDB调试汇编分析 代码 本次实践我参照了许多先做了的同学的博客,有卢肖明,高其,张梓靖同学.代码借用的是卢肖明同学的代码进行调试运行. GCC编译 使用gcc -g gdbtest.c -o gdbtest -m32命令在64位的机器上产生32位汇编代码 在使用gdb进行调试运行时,有cgdb和gdb两种工具,我建议大家使用张梓靖同学使用的cgdb工具,因为使用时可以随时看到自己的源代码,看到我们的断点在哪里,每一步返回值到了哪行,更加直观. 分析过程 使用b main指令在main函数处设置…
20145337 GDB调试汇编堆栈过程分析 测试代码 #include<stdio.h> short addend1 = 1; static int addend2 = 2; const static long addend3 = 3; static int g(int x) return x + addend1; } static const int f(int x) { return g(x + addend2); } int main(void) { return f(8) + add…
用Go语言已经有一段时间了,总结一下如何用GDB来调试它! ps:网上有很多文章都有描述,但是都不是很全面,这里将那些方法汇总一下 GDB简介  GDB是GNU开源组织发布的⼀一个强⼤大的UNIX下的程序调试⼯工具.或许,各位⽐比较喜欢那种图形界⾯面⽅方式的,像VC.BCB等IDE的调试,但如果你是在UNIX平台下做软件,你会 发现GDB这个调试⼯工具有⽐比VC.BCB的图形化调试器更强⼤大的功能.所谓“⼨寸有所⻓长,尺有所短”就是这个道理. 目前支持的语言 (GNU gdb (GDB) 7.8…
20145208 GDB调试汇编堆栈过程分析 测试代码 #include<stdio.h> short addend1 = 1; static int addend2 = 2; const static long addend3 = 3; static int g(int x) { return x + addend1; } static const int f(int x) { return g(x + addend2); } int main(void) { return f(8) + a…
GDB调试汇编分析 代码 #include<stdio.h> short addend1 = 1; static int addend2 = 2; const static long addend3 = 3; static int g(int x) { return x + addend1; } static const int f(int x) { return g(x + addend2); } int main(void) { return f(8) + addend3; } 这次代码因…
  1.生成core dump文件的方法: $  ulimit -c //查看是否为0 如果为0 $   ulimit -c unlimited 这样在程序崩溃以后会在当前目录生成一个core.xxxx的文件 2.调试core dump文件 生成了core.xxx文件以后 $  gdb ./应用程序  core.xxxx 就会恢复现场到你的程序崩溃的那一刻 (gdb)bt          //这个命令会列出程序崩溃时的堆栈信息,一层一层会有标号  #0  #1  #2 ....... 如果你要…
Gdb调试多进程程序 程序经常使用fork/exec创建多进程程序.多进程程序有自己独立的地址空间,这是多进程调试首要注意的地方.Gdb功能强大,对调试多线程提供很多支持. 方法1:调试多进程最土的办法:attach pid Attach是调试进程的常用办法,只要有可执行程序以及相应PID,即可工作.当然,为方便调试,可以在进程启动后,设定sleep一段时间,如30s,这样即可有充足的时间来attach. 方法2: set follow-fork-mode child + main断点 当设置s…