gdb调试命令是什么?
只对 g++ 起作用, 使用这个选项, g++ 将对不带参数的函数,都认为是没有显示的对参数的个数和类型说明,而不是没有参数。gdb调试命令如下:
gdb查看变量的值_gdb查看指针内容
gdb查看变量的值_gdb查看指针内容
pwd
1、启动gdb
$gdb
这样可以和gdb进行交互了。
2、启动gdb,并且分屏显示源代码
$gdb -tui
这样,使用了'-tui'选项,启动可以直接将屏幕分成两个部分,上面显示源代码,比用list方便多了。这时候使用上下方向键可以查看源代码,想要命令行使用上下键就用[Ctrl]n和[Ctrl]p。
3、启动gdb调试指定程序app
$gdb app
这样就在启动gdb之后直接载入了app可执行程序,需要注意的是,载入的app程序必须在编译的时候有gdb调试选项,例如'gcc -g app app.c',注意,如果修改了程序的源代码,但是没有编译,那么在gdb中显示的会是改动后的源代码,但是运行的是改动前的程序,这样会导致跟踪错乱的。
4、启动程序之后,再用gdb调试
$gdb
这里,
是程序的可执行文件名,
5、启动程序之后,再启动gdb调试
$gdb
这里,程序是一个服务程序,那么你可以指定这个服务程序运行时的进程ID,
gdb可以跟踪内存分配日志
默认情况下,GDB下运行的程序作输入输出的终端,与GDB所使用的是相同的。GDB把终端转换为它自己的终端方式与你交互,不过,它记录你的应用程序所使用的终端方式,当你继续运行你的程序时,它再切换回来。GDB是GNU开原组织旗下一款强大的代码调试工具,使用GDB可以自定义程序运行方式;让程序停止在你指定的位置设置断点;在停止点查看当前程序的状态:变量、寄存器的值;动态改变程序的状态。
在该变量的所在行加调试断点,在调试过程中,鼠标放在该变量上,IDE会弹出该变量的内容小窗口,然后把小窗口上的图钉固定,就可以在程序运行过程中查看它的变化了。如何在job的执行过程中修改job自身的下次执行时间
每次使用run启动的程序,都GDB的当前工作目录继承为它的工作目录。GDB的工作目录最初是继承自它的父进程(通常是shell),不过,你可以在GDB中使用cd命令指定一个新的工作目录。如何在job的执行过程中修改job自身的下次执行时间
在 /proc 文件系统中,对虚拟文件的读写作是一种与内核通信的手段,要查看内核回环缓冲区中的消息,可以使用 dmesg 工具(或者通过 /proc 本身使用 cat /proc/kmsg 命令)。清单 6 给出了 dmesg 显示的几条消息。程序变量
查看文件中某变量的值:
可以通过这种形式指定你所想查看的变量,是哪个文件中的或是哪个函数中的。例如,查看文件f2.c中的全局变量x的值:
查看数组的值
有时候,你需要查看一段连续的内存空间的值。比如数组的一段,或是动态分配的数据的大小。你可以使用GDB的“@”作符,“@”的左边是个内存的地址的值,“@”的右边则你你想查看内存的长度。例如,你的程序中有这样的语句:
int array = (int ) malloc (len sizeof (int));
于是,在GDB调试过程中,你可以以如下命令显示出这个动态数组的取值:
p array@len
如果是静态数组的话,可以直接用print数组名,就可以显示数组中所有数据的内容了。
linux中怎么使用gdb调试进程有dettach
在2.5.60版Linux内核及以后,GDB对使用fork/vfork创建子进程的程序提供了follow-fork-mode选项来支持多进程调试。 follow-fork-mode的用法为: set follow-fork-mode [parentchild] parent: fork之后继续调试父进程,子进程不受影响。 child: fork之后调试子进程,父进程不受影响。 因此如果需要调试子进程,在启动gdb后: (gdb) set follow-fork-mode child并在子进程代码设置断点。 此外还有detach-on-fork参数,指示GDB在fork之后是否断开(detach)某个进程的调试,或者都交由GDB控制: set detach-on-fork [onoff] on: 断开调试follow-fork-mode指定的进程。 off: gdb将控制父进程和子进程。follow-fork-mode指定的进程将被调试,另一个进程置于暂停(suspended)状态。 注意,使用GDB 6.6或以上版本,如果你使用的是GDB6.4,就只有follow-fork-mode模式。 follfunction::variableow-fork-mode/detach-on-fork的使用还是比较简单的,但由于其系统内核/gdb版本限制,我们只能在符合要求的系统上才能使用。而且,由于follow-fork-mode的调试必然是从父进程开始的,对于fork多次,以至于出现孙进程或曾孙进程的系统,例如上图3进程系统,调试起来并不方便。 Attach子进程 众所周知,GDB有附着(attach)到正在运行的进程的功能,即attach
命令。因此我们可以利用该命令attach到子进程然后进行调试。 例如我们要调试某个进程RIM_Oracle_Agent.9i,首先得到该进程的pid [root@tivf09 tianq]# ps -efgrep RIM_Oracle_Agent.9i nobody 6722 6721 0 05:57 ? 00:00:00 RIM_Oracle_Agent.9i root 7541 27816 0 06:10 pts/3 00:00:00 grep -i rim_oracle_agent.9i通过pstree可以看到,这是一个三进程系统,oserv是RIM_Oracle_prog的父进程,RIM_Oracle_prog又是RIM_Oracle_Agent.9i的父进程。 [root@tivf09 root]# pstree -H 6722通过 pstree 察看进程 启动GDB,attach到该进程 用 GDB 连接进程 现在就可以调试了。一个新的问题是,子进程一直在运行,attach上去后都不知道运行到哪里了。有没有办法解决呢? 一个办法是,在要调试的子进程初始代码中,比如main函数开始处,加入一段特殊代码,使子进程在某个条件成立时便循环睡眠等待,attach步 鼠标右键点击“我的电脑”选择属性选项,出现系统属性栏,如图所示:到进程后在该代码段后设上断点,再把成立的条件取消,使代码可以继续执行下去。 至于这段代码所采用的条件,看你的偏好了。比如我们可以检查一个指定的环境变量的值,或者检查一个特定的文件存不存在。以文件为例,其形式可以如下: void debug_wait(char tag_file) { while(1) { if (tag_file存在) 睡眠一段时间; else break; } }当attach到进程后,在该段代码之后设上断点,再把该文件删除就OK了。当然你也可以采用其他的条件或形式,只要这个条件可以设置/检测即可。 Attach进程方法还是很方便的,它能够应付各种各样复杂的进程系统,比如孙子/曾孙进程,比如守护进程(daemon process),需要的就是加入一小段代码。 GDB wrapper 很多时候,父进程 fork 出子进程,子进程会紧接着调用 exec族函数来执行新的代码。对于这种情况,我们也可以使用gdb wrapper 方法。它的优点是不用添加额外代码。 其基本原理是以gdb调用待执行代码作为一个新的整体来被exec函数执行,使得待执行代码始终处于gdb的控制中,这样我们自然能够调试该子进程代码。 还是上面那个例子,RIM_Oracle_prog fork出子进程后将紧接着执行RIM_Oracle_Agent.9i的二进制代码文件。我们将该文件重命名为RIM_Oracle_Agent.9i.binary,并新建一个名为RIM_Oracle_Agent.9i的shell脚本文件,其内容如下: [root@tivf09 bin]# mv RIM_Oracle_Agent.9i RIM_Oracle_Agent.9i.binary [root@tivf09 bin]# cat RIM_Oracle_Agent.9i #!/bin/sh gdb RIM_Oracle_Agent.binary当fork的子进程执行名为RIM_Oracle_Agent.9i的文件时,gdb会被首先启动,使得要调试的代码处于gdb控制之下。
怎样用GDB调试core文件
3.使用命令“rpm-ivhgdb-6.8-37.el5.rpm”或者类似的作回车即可安装;一般这种情况都是因为数组越界访问,空指针或是野指针读写造成的。程序小的话还比较好办,对着源代码仔细检查就能解决。但是对于代码量较大的程序,里边包含N多函数调用,N多数组指针访问,这时想定位问题就不是很容易了(此时牛人依然可以通过在适当位置打printf加二分查找的方式迅速定位:P)。懒人的话还是直接GDB搞起吧。 神马是Core Dump文件偶尔就能听见某程序员同学抱怨“擦,又出Core了!”。简单来说,core dump说的是作系统执行的一个动作,当某个进程因为一些原因意外终止(crash)的时候,作系统会将这个进程当时的内存信息转储(dump)到磁盘上1。产生的文件就是core文件了,一般会以core.xxx形式命名。 如何产生Core Dump 发生doredump一般都是在进程收到某个信号的时候,Linux上现在大概有60多个信号,可以使用 kill -l 命令全部列出来。sagi@sagi-laptop:~$ kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP 21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR 31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8 43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2 63) SIGRTMAX-1 64) SIGRTMAX针对特定的信号,应用程序可以写对应的信号处理函数。如果不指定,则采取默认的处理方式, 默认处理是coredump的信号如下:3)SIGQUIT 4)SIGILL 6)SIGABRT 8)SIGFPE 11)SIGSEGV 7)SIGBUS 31)SIGSYS 5)SIGTRAP 24)SIGXC找到正被调试的进程的当前工作目录,通常是做不到的(因为一个程序可以在它运行的时候改变它的目录)。如果你工作在GDB可以被配置为带有“/proc”支持的系统上的话,你可以利用 proc命令(见18.1.3 SVR4进程信息一节)找到debuggee的当前工作目录。PU 25)SIGXFSZ 29)SIGIOT 我们看到SIGSEGV在其中,一般数组越界或是访问空指针都会产生这个信号。另外虽然默认是这样的,但是你也可以写自己的信号处理函数改变默认行为,更多信号相关可以看参考链接33。 上述内容只是产生coredump的必要条件,而非充分条件。要产生core文件还依赖于程序运行的shell,可以通过ulimit -a命令查看,输出内容大致如下:sagi@sagi-laptop:~$ ulimit -a core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited scheng priority (-e) 20 file size (blocks, -f) unlimited pending signals (-i) 16382 max locked memory (kbytes, -l) 64 max memory size (kbytes, -m) unlimited open files (-n) 1024 pipe size (512 bytes, -p) 8 POSIX message queues (bytes, -q) 819200 real-time priority (-r) 0 stack size (kbytes, -s) 8192 cpu time (seconds, -t) unlimited max user processes (-u) unlimited virtual memory (kbytes, -v) unlimited file locks (-x) unlimited 看到行了吧,core file size,这个值用来限制产生的core文件大小,超过这个值就不会保存了。我这里输出是0,也就是不会保存core文件,即使产生了,也保存不下来==! 要改变这个设置,可以使用ulimit -c unlimited。 OK, 现在万事具备,只缺一个能产生Core的程序了,介个对C程序员来说太容易了。#include
Linux下怎么通过变量的地址得到对应变量在源文件中的变量名?gdb可以不
-o 指定输出文件名(o:output)-o output_filename,确定输出文件的名称为output_filename,同时这个名称不能和源文件同名。如果不给出这个选项,gcc就给出预设的可执行文件a.out。具体参数及讲解如下: print命令的格式是: print xxx p xxx 1. print 作符 @ 是一个和数组有关的作符,在后面会有更详细的说明。 :: 指定一个在文件或是一个函数中的变量。 {} 表示一个指向内存地址的类型为type的一个对象。
GDB的工作目录也担当着GDB作的指定文件命令的默认目录。参见指定文件的命令一节。如何gdb调试一个运行中的进程
清单 6. 查看来自 LKM 的内核输出例如程序的可执行文件名称为Dome
gdb Dome
进入gdb对话框。你要调试程序的某一段代码,在进入那段代码前打上一个断点。
break filename:linenum
然后0: Link is down执行程序
run
此时程序开始运行,如果是GUI界面,你可以在界面进行作,当这些作调用断点后的代码时,程序会停下来,这是你可以输入命令进行调试了,
next 2 //执行下面两行代码
VS2010 监视变量变化
可以。当程序被停住时,可以使用print命令(简写命令为p),或是同义命令inspect来查看当前程序的运行数据。用gdb调试程序时,可以使用“ set logging on ”命令把执行gdb的过程记录下来,方便以后自己参考或是别人帮忙分析。默认的日志文件是“ gdb.txt ”。debug时打开Variables视图,运行到断点时就会有相应的变量出现在这里,鼠标点上去就能看到值当然这儿显示的是一个个实例化的变量,比如String str = nu可以使用run命令,利用shell的重定向,重定向程序的输入和/或输出。ll;断点到这里时就会出现变量str,点击就能看到他的值:null;后面如果有变化,比如下一步是str = “hello”。运行到这里,str的值会变成hello,
linux 用g++编译c++代码的问题
此选项实现 ansi 选项的功能的一部分,它禁gdb安装步骤如下:首先可以使用命令“rpm-qa|grepgdb查询系统中是否安装了gdb包,如果安装了,应该显示如下:gdbm-1.8.0-26.2.1gdb-6.8-37.el5gdbm-dl-1.8.0-26.2.12.如果系统没有安装gdb包,需要先准备好gdb对应的包,通常在系统光盘文件夹下;止将 a, inline 和 typeof 用作关键字。1,注释掉 12行的CLOCKS_PER_SEC
2,你在open之前,单独创建一个string对象,把文件名保存好;
string fullname = "/home/wangwenyu/c13.03/more" + filename + ".in" ;
然后再去调用 fout.open
a=5,如何查看变量a的内存地址?
my_module_cleanup called. Module is now unloaded.步骤如下file::variable:
1、通过在代码中添加断点或者在GDB中设置断点,以便于在程序执行到某个位置时暂停。
2、在GDB中也可以使用命令break,main来设置断点。
3、输入命令run运行程序,当程序执行到断点处时会自动停止。
4、其中,0x7fffffffe1dc就是变量a的内存地址。