XCode下的GDB命令实例
来源:互联网 发布:篦子 淘宝 编辑:程序博客网 时间:2024/06/06 13:01
对于大多数Cocoa程 序员来说,最常用的debugger莫过于Xcode自带的调试工具了。而实际上,它正是gdb的一个图形化包装。相对于gdb,图形化带来了很多便利, 但同时也缺少了一些重要功能。而且在某些情况下,gdb反而更加方便。因此,学习gdb,了解一下幕后的实质,也是有必要的。
gdb可以通过终端运行,也可以在Xcode的控制台调用命令。本文将通过终端讲述一些gdb的基本命令和技巧。
首先,我们来看一个例子:
#import <Foundation/Foundation.h>
int main(int argc, char **argv)
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSLog(@"Hello, world!");
[pool release];
return 0;
}
我们把文件命名为test.m,然后编译:
gcc -g -framework Foundation test.m
准备工作已经完成。现在我们可以开始调试了。只要把要调试的文件名作为参数,启动gdb:
gdb a.out
gdb启动后会输出很多法律声明之类的信息。无视它们,最后我们看到一个提示:
(gdb)
成功!现在debugger和刚才编译好的程序都被装载了。不过,现在程序还没有开始运行。因为gdb在程序开始前把它暂停了,好让我们有机会设置调试参数。这次我们不需要做特别设置,所以马上开始运行吧:
(gdb) run
Starting program: /Users/mikeash/shell/a.out
Reading symbols for shared libraries .++++....................... done
2011-06-16 20:28:53.658 a.out[2946:a0f] Hello, world!
Program exited normally.
(gdb)
糟糕,程序竟然exited normally了(==|||)。这可不行,我们得让他崩溃才行。所以我们给这个小程序添加一个bug:
int x = 42;
NSLog("Hello, world! x = %@", x);
nice。这样一来程序就会漂亮地崩溃了:
(gdb) run
Starting program: /Users/mikeash/shell/a.out
Reading symbols for shared libraries .++++....................... done
Program received signal EXC_BAD_ACCESS, Could not access memory.
gdb可以通过终端运行,也可以在Xcode的控制台调用命令。本文将通过终端讲述一些gdb的基本命令和技巧。
首先,我们来看一个例子:
我们把文件命名为test.m,然后编译:
准备工作已经完成。现在我们可以开始调试了。只要把要调试的文件名作为参数,启动gdb:
gdb启动后会输出很多法律声明之类的信息。无视它们,最后我们看到一个提示:
成功!现在debugger和刚才编译好的程序都被装载了。不过,现在程序还没有开始运行。因为gdb在程序开始前把它暂停了,好让我们有机会设置调试参数。这次我们不需要做特别设置,所以马上开始运行吧:
糟糕,程序竟然exited normally了(==|||)。这可不行,我们得让他崩溃才行。所以我们给这个小程序添加一个bug:
nice。这样一来程序就会漂亮地崩溃了: