xcode ios gdb

先要说点关于ios的事.

大家开发ios时用的最多的软件是xcode.在苹果步步推广llvm的同时。也在步步推广lldb. (llvm对应gcc),(lldb对应gdb) 好在lldb里面对应的调试命令跟gdb里没太大区别。所以学好gdb,到时转lldb。可以写一篇10分钟精通lldb..:) 学习起来可以参考的东西也比较多。推荐看一本书《the art of debugging with gdb ,ddd and eclipse

gdb--命令行调试器。虽说xcode比较强大,但是命令行调试可以让你更精确的调试。而且这在很多操作系统里都是可以通用的命令。所以学好gdb这个调试器祖先。应付xcode的调试就可以轻车熟路。

先入个门.然后像跑hello,world一样跑一个hello,gdb,所以,主要说以下两点

 

1.配置gdb调试环境 

2.hello gdb!

3.FAQ 

 

 

 

配置gdb调试环境

 

如果你环境已经正确.请跳过这节.验证方式 在命令行里敲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里也比较常用 ,捕获异常时非常方便,能让开发人员很快的定位到代码中抛异常的位置。

3point 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

 

如果后面没有断点了.那就直接结束了.

转载于:https://my.oschina.net/u/2528742/blog/691579

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值