2011-03-26 39 views
4

我有一个可执行文件,我正在使用gdb进行调试。这是我第一次使用gdb,请耐心等待。GDB Objective-c调试(无符号表)

我想在函数中设置一个断点,我知道使用类转储的函数的名称。现在它不会让我为该函数添加断点,因为它表示没有符号表。我试图添加符号表,但它仍然抱怨没有符号表加载。

那么,有什么方法可以在此方法中设置断点?这是一个客观的c方法,而不是c(如果这有所影响)。我需要做的就是检查这种方法的论点。

+0

了,哟你用-g编译? – 2011-03-26 07:01:47

+0

你是如何调用GDB的?命令行? – 2011-03-26 07:03:01

回答

8

在class-dump中有一个-A选项可以打印函数的地址,例如,

(gdb) b *0x100000d54 
Breakpoint 1 at 0x100000d54 

需要注意的是,除非你已经剥去了可执行文件,你应该总是可以使用该方法的名称设置一个断点:

@interface FooObject : NSObject 
{ 
} 

- (void)y; // IMP=0x100000d54 

@end 

有了这个,你可以使用的地址设置一个断点

(gdb) b -[FooObject y] 
Breakpoint 2 at 0x100000d60 

(地址是不一样的,因为后者会跳过一些帧的设置代码。)

+0

谢谢,刚才那样做,虽然我将断点设置为0x00420d10,但它停在“断点1,0x35af7d10”处。这不是我设定的转折点?再次感谢 – user635064 2011-03-26 07:17:29

+0

@user:0x3xxxxxxx将是某些Apple库的位置。你确定你已经清除了以前的所有破发点吗? – kennytm 2011-03-26 07:24:29

+4

使用class-dump-z -A我只能得到VM偏移量,例如,我认为需要在应用程序的基址中添加例如xx97179,如何在应用程序加载时获取基址? – 2012-02-28 03:53:10