程序调试

使用 GDB 调试多进程程序

余生颓废 提交于 2019-12-25 06:44:42
使用 GDB 调试多进程程序 来源 https://www.ibm.com/developerworks/cn/linux/l-cn-gdbmp/index.html GDB 是 linux 系统上常用的 c/c++ 调试工具,功能十分强大。对于较为复杂的系统,比如多进程系统,如何使用 GDB 调试呢?考虑下面这个三进程系统: 进程 Proc2 是 Proc1 的子进程,Proc3 又是 Proc2 的子进程。如何使用 GDB 调试 proc2 或者 proc3 呢? 实际上,GDB 没有对多进程程序调试提供直接支持。例如,使用GDB调试某个进程,如果该进程fork了子进程,GDB会继续调试该进程,子进程会不受干扰地运行下去。如果你事先在子进程代码里设定了断点,子进程会收到SIGTRAP信号并终止。那么该如何调试子进程呢?其实我们可以利用GDB的特点或者其他一些辅助手段来达到目的。此外,GDB 也在较新内核上加入一些多进程调试支持。 接下来我们详细介绍几种方法,分别是 follow-fork-mode 方法,attach 子进程方法和 GDB wrapper 方法。 follow-fork-mode 在2.5.60版Linux内核及以后,GDB对使用fork/vfork创建子进程的程序提供了follow-fork-mode选项来支持多进程调试。 follow-fork

使用GDB调试产生多进程的程序

隐身守侯 提交于 2019-12-25 06:44:22
如果一个进程fork了多个进程,这时使用GBD工具对程序进行调试会如何呢? 实际上,GDB 没有对多进程程序调试提供直接支持。例如,使用GDB调试某个进程,如果该进程fork了子进程,GDB会继续调试该进程,子进程会不受干扰地运行下去。 如果你事先在子进程代码里设定了断点,子进程会收到SIGTRAP信号,如果没有对此信号进行捕捉处理,就会按默认的处理方式处理——终止进程。 那么该如何调试子进程呢?有3种方法: 1.follow-fork-mode 在2.5.60版Linux内核及以后,GDB对使用fork/vfork创建子进程的程序提供了follow-fork-mode选项来支持多进程调试: follow-fork-mode的用法为: set follow-fork-mode [parent|child]   parent:调试父进程,子进程不受影响   child:调试子进程,父进程不受影响 我们需要调试子进程,所以在启动gdb后,输入命令 set follow-fork-mode child 并在子进程代码处设置断点。此外还有detach-on-fork参数,指示GDB在fork之后是否断开(detach)某个进程的调试,或者都交由GDB控制: set detach-on-fork [on | off]   on: 断开调试follow-fork-mode指定的进程。  

gdb server调试步骤

牧云@^-^@ 提交于 2019-12-25 06:43:41
编译gdb/gdbserver 编译arm-linux-gdb 下载gdb-7.12,解压缩进入目录 ./configure --target=arm-linux --program-prefix=arm-linux- --prefix=/opt/arm-linux-gdb/ 修改gdb/remote.c //================================== 如果gdb提示:GDB7.6 Remote 'g' packet reply is too long 修改gdb/remote.c文件,屏蔽process_g_packet函数中的下列两行: if (buf_len > 2 * rsa->sizeof_g_packet) error (_(“Remote ‘g’ packet reply is too long: %s”), rs->buf); 在其后添加: if (buf_len > 2 * rsa->sizeof_g_packet) { rsa->sizeof_g_packet = buf_len ; for (i = 0; i < gdbarch_num_regs (gdbarch); i++) { if (rsa->regs[i].pnum == -1) continue; if (rsa->regs[i].offset >= rsa->sizeof

用GDB Server进行远程调试

孤街浪徒 提交于 2019-12-25 06:43:25
某些时候由于模拟环境的限制,调试必须要在目标板上进行。由于 嵌入式系统 资源比较有限,一般不能在目标板上直接构建GDB的调试环境,这时我们通常采用gdb+gdbserver的远程调试方法:gdbserver在目标板中运行,而gdb则在主机上运行。 构建gdb+gdbserver调试环境的在于,要将gdb和gdbserver都编译成适用于目标板的版本。比如我们用x86的主机和 ARM 目标板,平时在主机上直接调试的时候都使用用于x86调试的gdb,但这个gdb不能用于远程调试中,需要针对 ARM 平台进行配置之后重新编译才行;而gdbserver要运行在目标板上,则需要用arm-linux-gcc编译才行。 我们可以从 http://ftp.gnu.org/gnu/gdb/ 或其他站点下载GDB的源代码来进行编译。得到源代码包gdb-6.6.tar.gz之后,将target配置成arm- linux ,然后进行编译: $ tar xzvf gdb-6.6.tar.gz $ cd gdb-6.6 $ ./configure --target=arm-linux $ make $ make install 注意这时我们编译的是用于主机上的gdb程序,因此仍然用x86版本的gcc编译,而不是用arm-gcc。而接下来我们要编译的gdbserver程序则是运行在目标板上的,需要用arm

gdb调试多进程多线程程序

白昼怎懂夜的黑 提交于 2019-12-25 06:42:35
一、调试的指令   1.list命令      list  linenum  显示程序第linenum行的周围的程序     list  function  显示程序名为function的函数的源程序     list        显示当前行后面的源程序     list -        显示当前行前面的源程序   2.run(r):运行命令      run args   run命令可以直接接命令行参数值,也可以在执行run之前通过 set args + 参数值实现   3.break(b):打断点     b  linenum    在某行打断点     b +offset/-offset   在当前行的前面或者后面的offset停住     b filename:linenum 在某文件的某行打断点      b filename:function 在某文件某个函数入口处停住      b *address      在程序的运行地址处停住     b           没有参数在下一行停住      b where if condition 在满足条件的那一行停住     关闭断点:delete(d) breakpoint -id    4.单步命令:      step count  一次性执行count步,有函数进入函数     next count 

GDB调试之暂停

£可爱£侵袭症+ 提交于 2019-12-25 06:42:21
暂停机制: 有3种方式可以通知GDB暂停程序的执行。 a.断点: 通知GDB在程序中的特定位置暂停执行; b.监视点:通知GDB当特定内存位置(或者涉及一个或多个位置的表达式)的值发生变化时暂停执行; c.捕获点: 通知GDB当特定事件发生时暂停执行; 容易混淆的是,在GDB文档中将这3个机制都称为断点。这可能是因为它们的很多属性和命令都相同; GDB关于删除断点的delete命令:删除断点、监视点和捕获点; GDB中关于“位置”的含义非常灵活,它可以指各种源代码行、代码地址、源代码文件中的行号或者函数的入口等; 设置格式: 文件名:行号 断点可以通过函数名,当前文件内的行号来设置,也可以先指定文件名再指定行号,还可以指定与暂停位置的偏移量,或者用地址来设置; 程序员创建的每个断点(包括断点、监视点、和捕获点)都被标识为从1开始的唯一整数标识符;这个标识符用来执行该断点上的各种操作, break function 在函数function() 的入口(第一行可执行代码)处设置断点, 例如: break main 在源文件filename的line处设置断点,如果filename不在当前目录中,则可以给出相对路径名或者完全路径名来帮助GDB查找该文件。 例如: break source/bed.c:35 break bed.c:function 临时断点(只生效一次):

使用gdb进行调试中级篇

我与影子孤独终老i 提交于 2019-12-25 06:41:35
  闲话少叙,经过 上篇文章 的铺垫后,咱们趁热打铁,继续学习。    设置断点   break <function> 在进入指定函数时停住。C++中可以使用class::function或function(type,type)格式来指定函数名。    break <linenum> 在指定行号停住。    break filename:linenum 在源文件filename的linenum行处停住    break filename:function 在源文件filename的function函数的入口处停住    break *address 在程序运行的内存地址处停住    break if i=100 表示当i为100时停住程序    info breakpoints( info break ) 查看断点    设置观察点(WatchPoint)   观察点一般来观察某个表达式(变量也是一种表达式)的值是否有变化了,如果有变化,马上停住程序。我们有下面的几种方法来设置观察点:    watch <expr> 为表达式(变量)expr设置一个观察点。一量表达式值有变化时,马上停住程序    rwatch <expr> 当表达式(变量)expr被读时,停住程序    awatch <expr> 当表达式(变量)的值被读或被写时,停住程序    info watchpoints

GDB调试

╄→гoц情女王★ 提交于 2019-12-25 06:41:19
概述:   GDB是UNIX下强大的调试工具,如果在UNIX下调试C/C++程序,GDB会比IDE的调试工具更好使。   要调试C/C++的程序,首先在编译时,我们必须要把调试信息加到可执行文件中。使用编译器(cc/gcc/g++)的 -g 参数可以做到这一点。如:   如果没有-g,你将看不见程序的函数名、变量名,所代替的全是运行时的内存地址。当你用-g把调试信息加入之后,并成功编译目标代码以后,让我们来看看如何用gdb来调试他。 启动gdb   启动GDB的方法有以下几种: 1、gdb <program> program也就是你的执行文件,一般在当然目录下。如果你需要带 argv[] ,则需要选项 -args 2、gdb <program> core 用gdb同时调试一个运行程序和core文件,core是程序非法执行后core dump后产生的文件。 3、gdb <program> <PID> 如果你的程序是一个服务程序,那么你可以指定这个服务程序运行时的进程ID。gdb会自动attach上去,并调试他。program应该在PATH环境变量中搜索得到。    GDB实现的功能: 按自定义的要求来运行程序。 可让被指定的程序在你所设置的断点处停住 当程序被停住时,检查你的程序中所发生的所有事。 动态低改变运行环境   可能从这几点你会觉得和IDE的调试没什么两样

gdb Debug

为君一笑 提交于 2019-12-25 06:40:43
  源码会进行行号提示。   如果需要查看在其他文件中定义的函数,在l后加上函数名即可定位到这个函数的定义及查看附近的其他源码。或者:使用断点或单步运行,到某个函数处使用s进入这个函数。 3)设置断点  (gdb) b 6   这样会在运行到源码第6行时停止,可以查看变量的值、堆栈情况等;这个行号是gdb的行号。 4)查看断点处情况  (gdb) info b   可以键入"info b"来查看断点处情况,可以设置多个断点; 5)运行代码  (gdb) r 6)显示变量值  (gdb) p n   在程序暂停时,键入"p 变量名"(print)即可;   GDB在显示变量值时都会在对应值之前加上"$N"标记,它是当前变量值的引用标记,以后若想再次引用此变量,就可以直接写作"$N",而无需写冗长的变量名; 7)观察变量  (gdb) watch n 在某一循环处,往往希望能够观察一个变量的变化情况,这时就可以键入命令"watch"来观察变量的变化情况,GDB在"n"设置了观察点; 8)单步运行  (gdb) n 9)程序继续运行  (gdb) c   使程序继续往下运行,直到再次遇到断点或程序结束; 10)退出GDB  (gdb) q 2.断点调试 命令格式   例子       作用 break + 设置断点的行号  break n      在n行处设置断点 tbreak +

GDB 调试 一些命令

两盒软妹~` 提交于 2019-12-25 06:40:22
1. gdb查看指定地址的内存地址的值:examine 简写 x-----使用gdb> help x 来查看使用方式 x/ (n,f,u为可选参数)n: 需要显示的内存单元个数,也就是从当前地址向后显示几个内存单元的内容,一个内存单元的大小由后面的u定义f:显示格式 x(hex) 按十六进制格式显示变量。 d(decimal) 按十进制格式显示变量。 u(unsigned decimal) 按十进制格式显示无符号整型。 o(octal) 按八进制格式显示变量。 t(binary) 按二进制格式显示变量。 a(address) 按十六进制格式显示变量。 c(char) 按字符格式显示变量。 f(float) 按浮点数格式显示变量例如: 你可以使用examine命令(简写是x)来查看内存地址中的值。x命令的语法如下所示: x/<n/f/u> <addr> n、f、u是可选的参数。 n是一个正整数,表示显示内存的长度,也就是说从当前地址向后显示几个地址的内容。 f 表示显示的格式,参见上面。如果地址所指的是字符串,那么格式可以是s,如果 地址是指令地址,那么格式可以是i。 u 表示从当前地址往后请求的字节数,如果不指定的话,GDB默认是4个bytes。u参数可以用下面的字符来代替,b表示单字节,h表示双字节,w表示四字 节,g表示八字节。当我们指定了字节长度后