GDB 的常用命令 -- 用gdb 跟踪、调试 chromium webkit_unit_tests

用 gdb 调试chromium

在编译 chromium 的时候使用命令 make chrome webkit_unit_tests BUILDTYPE=Debug
或者在 src/Makefile 里面直接改。编译完成之后,就可以用gdb trace or debug 应用程序了。

cd out/Debug
gdb webkit_unit_tests
yajun@ubuntu:/media/android/chromium/src/out/Debug$ gdb webkit_unit_tests
GNU gdb (Ubuntu/Linaro 7.3-0ubuntu2) 7.3-2011.08
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
For bug reporting instructions, please see:
<http://bugs.launchpad.net/gdb-linaro/>...
Reading symbols from /media/android/chromium/src/out/Debug/webkit_unit_tests...

b main
r
然后程序就在 main 函数停止下来。

LOG 如下
Reading symbols from /media/android/chromium/src/out/Debug/webkit_unit_tests...done.
(gdb) b main
Breakpoint 1 at 0x41d6b4: file third_party/WebKit/Source/WebKit/chromium/tests/RunAllTests.cpp, line 57.
(gdb) r
Starting program: /media/android/chromium/src/out/Debug/webkit_unit_tests
warning: the debug information found in "/usr/lib/debug//lib/x86_64-linux-gnu/libz.so.1.2.3.4" does not match "/lib/x86_64-linux-gnu/libz.so.1" (CRC mismatch).


warning: the debug information found in "/usr/lib/debug/lib/x86_64-linux-gnu/libz.so.1.2.3.4" does not match "/lib/x86_64-linux-gnu/libz.so.1" (CRC mismatch).


[Thread debugging using libthread_db enabled]


Breakpoint 1, main (argc=1, argv=0x7fffffffdd78) at third_party/WebKit/Source/WebKit/chromium/tests/RunAllTests.cpp:57
57 ::testing::InitGoogleMock(&argc, argv);




关于GDB 的详细用法参考:

GDB命令行参数

启动GDB:

lgdb executable

lgdb -e executable -c core-file

lgdb executable -pid process-id

(使用命令'ps -auxw'可以查看进程的pid)

选项

含义

–help
-h

列出命令行参数。

–exec=file
-efile

指定可执行文件。

–core=core-file
-ccore-file

指明core文件。

–command=file
-xfile

从指定文件中读取gdb命令。

–directory=directory
-ddirectory

把指定目录加入到源文件搜索路径中。

–cd=directory

以指定目录作为当前路径来运行gdb。

–nx
-n

不要执行.gdbinit文件中的命令。默认情况下,这个文件中的命令会在所有命令行参数处理完后被执行。

–batch

在非交互模式下运行gdb。从文件中读取命令,所以需要-x选项。

–symbols=file
-sfile

从指定文件中读取符号表。

-write

允许对可执行文件和core文件进行写操作。

–quiet
-q

不要打印介绍和版权信息。

–tty=device

指定device为运行程序的标准输入输出。

–pid=process-id
-pprocess-id

指定要附属的进程ID。

GDB命令

GDB中使用的命令:

命令

描述

help

列出gdb帮助信息。

helptopic

列出相关话题中的gdb命令。

helpcommand

列出命令描述信息。

apropossearch-word

搜索相关的话题。

info args
i args

列出运行程序的命令行参数。

info breakpoints

列出断点。

info break

列出断点号。

info breakbreakpoint-number

列出指定断点的信息。

info watchpoints

列出观察点。

info registers

列出使用的寄存器。

info threads

列出当前的线程。

info set

列出可以设置的选项。

Break and Watch

breakfuntion
breakline-number

在指定的函数,或者行号处设置断点。

break +offset
break -offset

在当前停留的地方前面或后面的几行处设置断点。

breakfile:func

在指定的file文件中的func处设置断点。

breakfile:nth

在指定的file文件中的第nth行设置断点。

break *address

在指定的地址处设置断点。一般在没有源代码时使用。

breakline-numberifcondition

如果条件满足,在指定位置设置断点。

breaklinethreadthread-number

在指定的线程中中断。使用info threads可以显示线程号。

tbreak

设置临时的断点。中断一次后断点会被删除。

watchcondition

当条件满足时设置观察点。

clear
clearfunc
clearnth

清除函数func处的断点。
清除第nth行处的断点。

delete
d

删除所有的断点或观察点。

deletebreakpoint-number
deleterange

删除指定的断点,观察点。

disablebreakpoint-number-or-range
enablebreakpoint-number-or-range

不删除断点,仅仅把它设置为无效,或有效。
例子:
显示断点:info break
设置无效:disable 2-9

enable oncebreakpoint-number

设置指定断点有效,当到达断点时置为无效。

enable delbreakpoint-number

设置指定断点有效,当到达断点时删除它。

finish

继续执行到函数结束。

Line Execution

step
s
stepnumber-of-steps-to-perform

进入下一行代码的执行,会进入函数内部。

next
n
nextnumber

执行下一行代码。但不会进入函数内部。

until
untilline-number

untilline-numberifcondition

继续运行直到到达指定行号,或者函数,地址等。

return
returnexpression

弹出选中的栈帧(stack frame)。如果后面指定参数,则返回表达式的值。

stepi
si
nexti
ni

执行下一条汇编/CPU指令。

info signals
info handle
handleSIGNAL-NAMEoption

当收到信号时执行下列动作:nostop(不要停止程序),stop(停止程序执行),print(显示信号),noprint(不显示),pass/noignore(允许程序处理信号),nopass/ignore(不让程序接受信号)

where

显示当前的行号和所处的函数。

Program Stack

backtrace
bt
btinner-function-nesting-depth
bt -outer-function-nesting-depth

显示当前堆栈的追踪,当前所在的函数。

backtrace full

打印所有局部变量的值。

framenumber
fnumber

选择指定的栈帧。

upnumber
downnumber

向上或向下移动指定个数的栈帧。

info frameaddr

描述选中的栈帧。

info args
info all-reg
info locals
info catch

显示选中栈帧的参数,局部变量,异常处理函数。all-reg也会列出浮点寄存器。

Source Code

list
l
listline-number
listfunction
list -
liststart#,end#
listfilename:function

列出相应的源代码。

set listsizecount
show listsize

设置list命令打印源代码时的行数。

directorydirectory-name
dirdirectory-name
show directories

在源代码路径前添加指定的目录。

directory

当后面没有参数时,清除源代码目录。

Examine Variables

printvariable
pvariable
pfile::variable
p 'file'::variable

打印指定变量的值。

p *array-var@length

打印arrary-var中的前length项。

p/xvar

以十六进制打印整数变量var

p/dvar

把变量var当作有符号整数打印。

p/uvar

把变量var作为无符号整数打印。

p/ovar

把变量var作为八进制数打印。

p/tvar
x/baddress
x/b &variable

以整数二进制的形式打印var变量的值。

p/cvariable

当字符打印。

p/fvariable

以浮点数格式打印变量var

p/avariable

打印十六进制形式的地址。

x/waddress
x/4b &variable

打印指定的地址,以四字节一组的方式。

callexpression

类似于print,但不打印void。

disassemaddr

对指定地址中的指令进行反汇编。

Controlling GDB

setgdb-optionvalue

设置GDB的选项。

set print array on
set print array off
show print array

以可读形式打印数组。默认是off。

set print array-indexes on
set print array-indexes off
show print array-indexes

打印数组元素的下标。默认是off。

set print pretty on
set print pretty off
show print pretty

格式化打印C结构体的输出。

set print union on
set print union off
show print union

打印C中的联合体。默认是on。

set print demangle on
set print demangle off
show print demangle

控制C++中名字的打印。默认是on。

Working Files

info files
info share

列出当前的文件,共享库。

filefile

file当作调试的程序。如果没指定参数,丢弃。

corefile

file当作core文件。如果没指定参数,则丢弃。

execfile

file当作执行程序。如果没指定参数,则丢弃。

symbolfile

file中读取符号表。如果没指定参数,则丢弃。

loadfile

动态链入file文件,并读取它的符号表。

pathdirectory

把目录directory加入到搜索可执行文件和符号文件的路径中。

Start and Stop

run
r
runcommand-line-arguments
run <infile>outfile

从头开始执行程序,也允许进行重定向。

continue
c

继续执行直到下一个断点或观察点。

continuenumber

继续执行,但会忽略当前的断点number次。当断点在循环中时非常有用。

kill

停止程序执行。

quit
q

退出GDB调试器。

GDB操作提示

l在编译可执行文件时需要给gcc加上"-g"选项,这样它才会为生成的可执行文件加入额外的调试信息。

l不要使用编译器的优化选项,比如:"-O","-O2"。因为编译器会为了优化而改变程序流程,那样不利于调试。

l在GDB中执行shell命令可以使用:shell command

lGDB命令可以使用TAB键来补全。按两次TAB键可以看到所有可能的匹配。

lGDB命令缩写:例如info bre中的bre相当于breakpoints。

GDB在Emacs中的操作:

emacs按键

动作

M-x gdb

切换到gdb模式。

C-h m

显示gdb模式介绍信息。

M-s

等同于gdb中的step命令。

M-n

等同于gdb中的next命令。

M-i

等同于gdb中的stepi命令。

C-c C-f

等同于gdb中的finish命令。

M-c

等同于gdb中的continue命令。

M-u

等同于gdb中的up命令。

M-d

等同于gdb中的down命令。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值