先要说点关于ios的事.ios
你们开发ios时用的最多的软件是xcode.在苹果步步推广llvm的同时。也在步步推广lldb. (llvm对应gcc),(lldb对应gdb)。 好在lldb里面对应的调试命令跟gdb里没太大区别。因此学好gdb,到时转lldb。能够写一篇10分钟精通lldb..:) 学习起来能够参考的东西也比较多。推荐看一本书《the art of debugging with gdb ,ddd and eclipse 》c++
gdb--命令行调试器。虽然说xcode比较强大,可是命令行调试可让你更精确的调试。并且这在不少操做系统里都是能够通用的命令。因此学好gdb这个调试器祖先。应付xcode的调试就能够轻车熟路。xcode
先入个门.而后像跑hello,world同样跑一个hello,gdb,因此,主要说如下两点app
1.配置gdb调试环境 eclipse
2.hello gdb!学习
3.FAQ 优化
配置gdb调试环境spa
若是你环境已经正确.请跳过这节.验证方式 在命令行里敲gdb,会出现gdb的版权信息.操作系统
1: bogon:enviro zk$ gdb命令行
2: GNU gdb 6.3.50-20050815 (Apple version gdb-1820) (Sat Jun 16 02:40:11 UTC 2012)
3: Copyright 2004 Free Software Foundation, Inc.
4: GDB is free software, covered by the GNU General Public License, and you are
5: welcome to change it and/or distribute copies of it under certain conditions.
6: Type "show copying" to see the conditions.
7: There is absolutely no warranty for GDB. Type "show warranty" for details.
8: This GDB was configured as "x86_64-apple-darwin".
9: (gdb)
自xcode4.3后。在xcode以单独的app发布。至关于绿色软件。因此,若是你以前用如下命令行卸载过xcode
sudo /Developer/Library/uninstall-devtools --mode=all
请在命令行下执行,否则你会在命令行中找不到gdb :(
xcode-select -swith 当前xcode.app/Contents/Developer 所在路径
好比说,我如今的的xcode.app 放在
/Volums/Workspace/Xcode.app
那么就执行
xcode-select -switch /Volums/Workspace/Xcode.app/Contents/Developer
hello gdb!
首先准备好咱们的调试文件test.cpp 以下
#include <iostream>
int main()
{
int i=0;
i=10;
std::cout<<"hello,gdb"<<i<<std::endl;
return 0;
}
编译之。。
gcc -lStdC++ -g -Wall -o test test.cpp
或者用
g++ -g -o test test.cpp
为简单起见 之后通用g++ ,这是GNU默认的c++编译器。
参数解释:
-g 产生相应的调试信息,
-o 编译产生后的文件名 在这里也就test准备开始调试 执行gdb载入要调试的程序(注意,这里并没开始执行test,只是载入)
gdb test
这个时候。你会看到命令行以下输出
Codebogon:pg_019 cubase01$ gdb test
GNU gdb 6.3.50-20050815 (Apple version gdb-1820) (Sat Jun 16 02:40:11 UTC 2012)
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "x86_64-apple-darwin"...Reading symbols for shared libraries ... done
(gdb)
此时,让咱们开始在调试环境下执行test,输入
run
你将看到输出
(gdb) run
Starting program: /Users/Desktop/Debugging/test
Reading symbols for shared libraries ++......................... done
hello,gdb10
Program exited normally.
好了,以上的步骤,就至关于你在xcode里用debug模式运行程序。
让程序在运行中停下来
在gdb中,有3种方式让程序停下来。
1.breakpoint 这种形式是咱们最经常使用的,反映在xcode里就是在行前双击。产生一个蓝色的标签。
2.watchpoint 这种用的也多,若是你要监测一段内存是否发生变化。或者说一个变量是否发生变化,能够用它。
3.catchpoint 这种形式是当特色形式的事件发生时,会中止程序运行。好比说,系统抛异常了。这个在xcode里也比较经常使用 ,捕获异常时很是方便,能让开发人员很快的定位到代码中抛异常的位置。
这3种point 在GNU中统称breakpoint--断点GNU 参考 。比较囧 ,固然。重点说1.breakpoint 的应用。
有如下用法
break 3 //在当前调试的文件中的第3行中止程序
break main //在当前调试的文件中的symbol table中找main这样的名字。若是找到。则中止程序。
break test.cpp:3 // 在test.cpp文件中的第3行中止程序
break test.cpp:main //在test.cpp文件的symbol table中找main这样的名字。若是找到。则中止程序。
你能够在命令行里执行以上全部
(gdb) b 3
Breakpoint 1 at 0x100000d34: file test.cpp, line 3.
(gdb) b main
Note: breakpoint 1 also set at pc 0x100000d34.
Breakpoint 2 at 0x100000d34: file test.cpp, line 4.
(gdb) b test.cpp:3
Note: breakpoints 1 and 2 also set at pc 0x100000d34.
Breakpoint 3 at 0x100000d34: file test.cpp, line 4.
(gdb) b test.cpp:main
Note: breakpoints 1, 2 and 3 also set at pc 0x100000d34.
Breakpoint 4 at 0x100000d34: file test.cpp, line 4.
查看一下断点的状况
执行
info break
这命令有点长,你能够用缩写 i b
关于缩写,gdb遵循一个这样的原则。只要缩写不会产生歧义。任何缩写均可以
好比说 info break
我打如下命令均可以
i b
i bre
i break
i bre
执行i b 后,显示以下
gdb) i b
Num Type Disp Enb Address What
1 breakpoint keep y 0x0000000100000d34 in main at test.cpp:3
2 breakpoint keep y 0x0000000100000d34 in main at test.cpp:4
3 breakpoint keep y 0x0000000100000d34 in main at test.cpp:4
4 breakpoint keep y 0x0000000100000d34 in main at test.
以上各行含义解释以下
Num
这是一个断点的标示id,之后有须要索引这个断点的地方全靠它。
Type
如咱们前面所说。这是3个断点中的一种
Disp
缩写(Dispensable),表明的意思就说能不能被自动删掉。有一处断点叫临时断点。就是中断一次后。断点就被删除了,下次再通过时,不会中断 tbreak 3 (在第3行设置临时断点) 这里显示的是keep ,表明永久断点。
Enb
缩写(Enable) 在xcode中。你能够暂时性的不激活断点,可是断点还存在,y表明激活。n表明不激活。
Address
这个表明的是断点在内存中设置的具体位置。通常汇编人员用。。普通青年用不上。
What
这个是对断点的一些信息描述。
如上所示。咱们在第3行打一个断点。以某种方式在第4行打了3个断点。重复的断点只会停一次。
如今,让我再次以调试模式运行test 。输入
run
显示
Starting program:
/Users/cubase01/Desktop/Debugging/Chapter_01/insert_sort/pg_019/test
Breakpoint 1, main () at test.cpp:4
4 int i=0;
程序停下来了。。此时程序并无执行第4行,是将要执行这一行,切记。
我想。你有如下这几个疑问,FAQ时间到。
FAQ:
1.不是说在第3行有断点吗?怎么先到了第4行?
在xcode里调试。开发人员会有一种错觉。就是认为源文件与调试的行是一一对应的。实际上不是。g++ 在编译时经过 -g命令生成一个叫symbol table的东东,翻成中文叫符号表。做用就是将二进制代码与源文件对应起来。 将断点断在main上。gdb认为这对调试没有任何做用。因此会自动优化到int i=0 。这种优化在-g命令时还不是很明显。当你开启g++ -O9时,g++会强力优化代码 。好比说如下代码
int i=0;
i=1;
i=2;
i=3;
用g++ -O9编译后。会被优化成int i=3;若是你用优化后的代码去调试。。要获得准确的行号是很难的。这能够算是一个比较麻烦的地方。由于优化极可能优化出bug。致使没法正常调试。
2.怎么查看i的值?
在命令行里输入
print i (缩写 p i)
输出
(gdb) p i
$1 = 0
(gdb)
3 怎么单步调试?
在命令行里输入
next (缩写 n)
输出
(gdb) next
5 i=10;
4.我这样一步一步点好累啊!!能一次走两步么 ?
n 3
一次走3步。
5.我想从新调试程序,怎么办啊! 再次运行
run
6 我想直接执行到下一个断点,怎么办?
continue
若是后面没有断点了.那就直接结束了.