安装
brew install gdb 安装gdb
start调试报错
Unable to find Mach task port for process-id 15634: (os/kern) failure (0x5).
During startup program terminated with signal ?, Unknown signal.
证书创建过程参考:
http://www.jianshu.com/p/99b057d5566f
google说没有code-sign,安装步骤一步一步证书签名认证,重启电脑,还是报错:
Starting program: /Users/Nj/www/C/test/test
[New Thread 0x1603 of process 1648]
warning: unhandled dyld version (15)
> echo "set startup-with-shell off" >> ~/.gdbinit 按照提示信息创建gdbinit文件,并更改权限755
关掉终端,重启系统,终于可以start了~~~
gdb使用
gdb常用命令
file
装入想要调试的程序
run
执行当前被调试的程序
kill
终止当前被调试的程序
step
执行一行源代码而且进入函数的内部
next
执行一行源代码,但不进入函数的内部
break
在代码里设置断点,会使程序执行到这里时被挂起
print
打印变量或者表达式的值,或打印内存中某个变量开始的一段连续区域的值,还用来对变量赋值
display
设置自动显示的表达式或者变量,当程序停住或者再单步跟踪的时候,这些变量会自动显示当前值
list
列出产生执行文件的源代码的一部分
quit
退出gdb
watch
监视一个变量的值
backtrace
回溯跟踪
frame n
定位到发生错误的代码段 n为backtrace命令的输出结果中的行号
examine
查看内存地址中的值
jump
使程序跳转
signal
产生信号量
return
强制函数返回
call
强制调用函数
make
使用户不退出gdb就可以重新产生可执行文件
shell
是用户不离开gdb就可以执行shell命令
p(print)<expr>
打印变量的值
p/x
十六进制打印
p/d
十进制打印
p/u
十六进制无符号数打印
p/o
八进制打印
p/t
二进制打印
p/c
按字符格式
s(step)
执行下一条指令,并进入指令的内部
n(next)
执行下一条指令,不进入指令的内部
display
自动显示变量的值
undisplay
删除自动显示
disable display <dnum>
不删除,只是让它失效
info display
显示所有设置的自动显示
x(examine)
查看内存
x/<n/f/u> <addr>
n是正整数,表示显示的内存长度,也就是从当前地址向后显示几个地址的内容
f是显示的格式字符串格式s 指令地址i
u表示从当前地址向后显示几个字节默认4个,b表示单字节、h表示双字节、w表示4个字节、g表示8个字节
show convenice
显示所有的环境变量
set $foo = bar
设置一个环境变量
set $a = 1;
p $a + 1; //可以得到2
info registers
显示寄存器的情况(不包括浮点寄存器)
info all-register
查看所有寄存器的情况
info registers <regname>
查看指定寄存器的情况
也可以使用print查看,只需要在寄存器的名字前加上一个$
符号就可以了
查看源程序
list <linenum>
显示指定行周围的代码
list <function>
显示函数名为function的函数的源程序
list <first>,<end>
显示first end之间的代码
show listsize
查看当前设置的显示行数
set listsize <count>
设置一次显示的行数
list
显示当前行后边的源程序
disassemble
查看程序的汇编代码
改变程序的执行
使用print num=.. 来改变程序中的值
查看内存地址
info line X
X可以是行号、文件名:行号、函数名、文件名:函数名的形式
跳转执行
jump <linespec>
linespec可以是文件行号,也可以是file:line的形式或者是+num这种格式,表示下一条运行语句从哪里开始
jump <address>
表示跳转到哪一代码行的运行地址
return <expr>
强制函数返回
call <expr>
强制调用函数
show language
查看当前的语言环境
info frame
查看当前函数的程序语言
info source
查看当前文件的程序语言