189 8069 5689

go语言gdb调试,go语言执行cmd命令

gdb调试命令是什么?

gdb调试命令如下:

10年积累的做网站、网站建设经验,可以快速应对客户对网站的新想法和需求。提供各种问题对应的解决方案。让选择我们的客户得到更好、更有力的网络服务。我虽然不认识你,你也不认识我。但先网站设计后付款的网站建设流程,更有荣成免费网站建设让你可以放心的选择与我们合作。

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 program PID

这里,program是程序的可执行文件名,PID是要调试程序的PID.如果你的程序是一个服务程序,那么你可以指定这个服务程序运行时的进程ID。gdb会自动attach上去,并调试他。program应该在PATH环境变量中搜索得到。

5、启动程序之后,再启动gdb调试

$gdb PID

这里,程序是一个服务程序,那么你可以指定这个服务程序运行时的进程ID,PID是要调试程序的PID.这样gdb就附加到程序上了,但是现在还没法查看源代码,用file命令指明可执行文件就可以显示源代码了。

如何用GDB进行调试

1: 对于在应用程序中加入参数进行调试的方法:

直接用 gdb app -p1 -p2 这样进行调试是不行的。

需要像以下这样使用:

#gdb app

(gdb) r -p1 -p2

或者在运行run命令前使用set args命令:

(gdb) set args p1 p2

可以用show args 命令来查看

2. 加入断点:

break linenumber

break funcName

break +offset

break -offset

(在当前行号的前面或后面的offset行停住。)

break filename:linenum

在源文件filename的linenum行处停住。

break filename:function

在源文件filename的function函数的入口处停住。

break ... if

...可以是上述的参数,condition表示条件,在条件成立时停住。比如在循环境体中,可以设置 break if i=100,表示当i为100时停住程序。

3. 查看运行时的堆栈:

使用bt命令

4. 打印某个变量的值:

print val

5. 单步: n

继续运行: c

step

单步跟踪,如果有函数调用,他会进入该函数。

next

同样单步跟踪,如果有函数调用,他不会进入该函数。很像VC等工具中的step over。后面可以加count也可以不加,不加表示一条条地执行,加表示执行后面的count条指令,然后再停住。

set step-mode

set step-mode on

打开step-mode模式,于是,在进行单步跟踪时,程序不会因为没有debug信息而不停住。这个参数有很利于查看机器码。

set step-mod off

关闭step-mode模式。

finish

运行程序,直到当前函数完成返回。并打印函数返回时的堆栈地址和返回值及参数值等信息。

until 或 u

当你厌倦了在一个循环体内单步跟踪时,这个命令可以运行程序直到退出循环体。

6.在GDB中执行shell命令:

 在gdb环境中,你可以执行UNIX的shell的命令,使用gdb的shell命令来完成:

 eg. shell make

7. 运行环境

可设定程序的运行路径。

show paths 查看程序的运行路径。

set environment varname [=value] 设置环境变量。如:set env USER=hchen

show environment [varname] 查看环境变量。

8.观察点(WatchPoint)

观察点一般来观察某个表达式(变量也是一种表达式)的值是否有变化了,如果有变化,马上停住程 序。我们有下面的几种方法来设置观察点:

watch

为表达式(变量)expr设置一个观察点。一量表达式值有变化时,马上停住程序。

rwatch

当表达式(变量)expr被读时,停住程序。

awatch

当表达式(变量)的值被读或被写时,停住程序。

info watchpoints

列出当前所设置了的所有观察点。

9. 维护breakpoint

clear

清除所有的已定义的停止点。

clear func

清除所有设置在函数上的停止点。

delete [breakpoints] [range...]

删除指定的断点,breakpoints为断点号。如果不指定断点号,则表示删除所有的断点。range 表示断点号的范围(如:3-7)。其简写命令为d。

比删除更好的一种方法是disable停止点,disable了的停止点,GDB不会删除,当你还需要时,enable即可,就好像回收站一样。

disable [breakpoints] [range...]

disable所指定的停止点,breakpoints为停止点号。如果什么都不指定,表示disable所有的停止 点。简写命令是dis.

enable [breakpoints] [range...]

enable所指定的停止点,breakpoints为停止点号。

10、程序变量

查看文件中某变量的值:

file::variable

function::variable

可以通过这种形式指定你所想查看的变量,是哪个文件中的或是哪个函数中的。例如,查看文件f2.c中的全局变量x的值:

gdb) p 'f2.c'::x

查看数组的值

有时候,你需要查看一段连续的内存空间的值。比如数组的一段,或是动态分配的数据的大小。你可以使用GDB的“@”操作符,“@”的左边是第一个内存的地址的值,“@”的右边则你你想查看内存的长度。例如,你的程序中有这样的语句:

int *array = (int *) malloc (len * sizeof (int));

于是,在GDB调试过程中,你可以以如下命令显示出这个动态数组的取值:

p *array@len

如果是静态数组的话,可以直接用print数组名,就可以显示数组中所有数据的内容了。

11.输出格式

一般来说,GDB会根据变量的类型输出变量的值。但你也可以自定义GDB的输出的格式。例如,你想输出一个整数的十六进制,或是二进制来查看这个整型变量的中的位的情况。要做到这样,你可以使用GDB的数据显示格式:

x 按十六进制格式显示变量。

d 按十进制格式显示变量。

u 按十六进制格式显示无符号整型。

o 按八进制格式显示变量。

t 按二进制格式显示变量。

a 按十六进制格式显示变量。

c 按字符格式显示变量。

f 按浮点数格式显示变量。

(gdb) p i

$21 = 101

(gdb) p/a i

$22 = 0x65

(gdb) p/c i

$23 = 101 'e'

(gdb) p/f i

$24 = 1.41531145e-43

(gdb) p/x i

$25 = 0x65

(gdb) p/t i

$26 = 1100101

11.查看内存

使用examine命令(简写是x)来查看内存地址中的值。x命令的语法如下所示:

x/

n、f、u是可选的参数。

n 是一个正整数,表示显示内存的长度,也就是说从当前地址向后显示几个地址的内容。

f 表示显示的格式,参见上面。如果地址所指的是字符串,那么格式可以是s,如果地十是指令地址,那么格式可以是i。

u 表示从当前地址往后请求的字节数,如果不指定的话,GDB默认是4个bytes。u参数可以用下面的字符来代替,b表示单字节,h表示双字节,w表示四字节,g表示八字节。当我们指定了字节长度后,GDB会从指内存定的内存地址开始,读写指定字节,并把其当作一个值取出来。

n/f/u三个参数可以一起使用。例如:

命令:x/3uh 0x54320 表示,从内存地址0x54320读取内容,h表示以双字节为一个单位,3表示三个单位,u表示按十六进制显示。

12.自动显示

你可以设置一些自动显示的变量,当程序停住时,或是在你单步跟踪时,这些变量会自动显示。相关的GDB命令是display。

display

display/

display/ expr

expr是一个表达式,fmt表示显示的格式,addr表示内存地址,当你用display设定好了一个或多个表达式后,只要你的程序被停下来,GDB会自动显示你所设置的这些表达式的值。

格式i和s同样被display支持,一个非常有用的命令是:

display/i $pc

undisplay

delete display

删除自动显示,dnums意为所设置好了的自动显式的编号。

disable display

enable display

disable和enalbe不删除自动显示的设置,而只是让其失效和恢复。

info display

查看display设置的自动显示的信息。GDB会打出一张表格,向你报告当然调试中设置了多少个自动显示设置,其中包括,设置的编号,表达式,是否enable。

13. 设置显示选项

set print address

set print address on

打开地址输出,当程序显示函数信息时,GDB会显出函数的参数地址。系统默认为打开的,

show print address

查看当前地址显示选项是否打开。

set print array

set print array on

打开数组显示,打开后当数组显示时,每个元素占一行,如果不打开的话,每个元素则以逗号分隔。这个选项默认是关闭的。与之相关的两个命令如下,我就不再多说了。

set print array off

show print array

set print elements

这个选项主要是设置数组的,如果你的数组太大了,那么就可以指定一个来指定数据显示的最大长度,当到达这个长度时,GDB就不再往下显示了。如果设置为0,则表示不限制。

show print elements

查看print elements的选项信息。

set print null-stop

如果打开了这个选项,那么当显示字符串时,遇到结束符则停止显示。这个选项默认为off。

set print pretty on

如果打开printf pretty这个选项,那么当GDB显示结构体时会比较漂亮。

14.关于显示源码list

GDB 调试Coredump问题

如果用CMake编译工程,则使用选项CMAKE_BUILD_TYPE=Debug:

这样做g++编译时就会包含选项-g。如果要同时包含-ggdb选项,可以设置变量CMAKE_CXX_FLAGS_DEBUG。

%e - insert coredumping executable name into filename 添加导致产生core的命令名

%p - insert pid into filename 添加pid(进程id)

运行程序,生成core文件。下面的命令强制生成core文件:

或者进入gdb后

file从文件exec加载symbol和executable, core从core中加载coredump

如果是调试Core的机器(host)不是生成Core的机器(target),则动态库可能不在程序指定的位置上。这时需要指定动态库的位置。

首先用info sharedlibrary,可以查看动态库的symbol是否加载正确

如果库在host上的布局与在target上的布局相同,则使用solib-absolute-prefix比较方便。

target上:

host上:

则可以设置solib-search-path为:

solib-absolute-prefix有个更常用的别名sysroot,所以如下的命令是一样的:

设置solib-search-path可以指定多个路径,路径之间用:隔开。

在多线程的环境下,可以用info threads显示所有线程,thread指定线程为当前线程。

GDB 常用法

GDB 调试Coredump问题

嵌入式开发中GDB调试Coredump问题

嵌入式开发中GDB串口远程调试

用backtrace()调试coredump问题

Valgrind memcheck 用法

Address Sanitizer 用法

段错误及GDB Coredump调试方法

gdb调试多进程与多线程

学习go语言,用什么IDE比较好

1、Sublime text

这个文本编辑器在编程界极为普遍,它并非一个完全成熟的IDE,但它具备了很多语言的扩展插件,比如Pyhon、lua等,其中有一个插件GoSublime专门针对Go语言,提供了语法高亮、自动补全等功能,这些功能使Sublime Text称为一个很实用的Go IDE。

2、IntelliJ

由Jetbrains提供,在Java开发者中更为流行,其自带的Go插件支持语法高亮显示、代码补全、自动编译以及子库支持,这就使使用者可以很方便地将项目拆分成多个包,可以在一个单独的IDE中浏览它。它有个很好用的功能,插件使用了突出显示来显示未使用的变量或包。

3、LiteIDE

目前也是一个专门针对Go的IDE了,功能很全面,具备语法高亮、自动补全、自动编译、调试、包浏览及管理。调试器在后台使用的gdb,这样可以方便地打印变量值、查看当前堆栈信息。

4、Intype

是仅Windows下支持的文本编辑器,具备有限的语法高亮支持和特定的高亮显示设置。

5、Netbeans

Netbeans内建支持了大量语言,同时具备Go插件,从而可以同创建正常项目一样,创建Go源文件,除了语法高亮以外,其Go插件并不支持其他特殊功能,如何使用IDE编译Go文件还不得而知。

6、Eclipse

最受欢迎的IDE,GoClipse插件在Eclipse中添加了IDE功能来支持Go,GoClipse提供了可配置的语法高亮显示、自动文档补全、自动编译以及最重要的实验调试支持。

7、TextMate

是一个Mac OS下的文本编辑器,可扩展它以突出显示Go代码,并提供源代码片段。

8、Komodo Edit

来自ActiveState的开源代码编辑器,基于Monzilla 7.0且支持跨平台,支持多种语言,但免费版的Komodo功能有限,它的golang插件komodo-go提供了基本的语法高亮、代码补全功能。

GDB 调试命令

(gdb) i r

(gdb) i r a # 查看所有寄存器(包括浮点、多媒体)

(gdb) i r esp

(gdb) i r pc

(gdb) x /wx 0x80040000 # 以16进制显示指定地址处的数据

(gdb) x /8x esp+12

(gdb) x /16s 0x86468700 # 以字符串形式显示指定地址处的数据

(gdb) x /24i 0x8048a51 # 以指令形式显示指定地址处的数据(24条)

(gdb) set $v0 = 0x004000000

(gdb) set $epc = 0xbfc00000

(gdb) set {unsigned int}0x8048a51=0x0

(gdb) set (unsigned int )0x8048a54=0x55aa55aa

Usage: find start end count value

(gdb) b *0x80400000

(gdb) watch *(unsigned int *)0xbffff400==0x90909090

更多


分享文章:go语言gdb调试,go语言执行cmd命令
链接地址:http://cdxtjz.cn/article/phdjeg.html

其他资讯