1

私はこのコードで gdb でいくつかのことをテストしていました (これは間違ったコードです。テスト目的でのみ使用します):

#import <Foundation/Foundation.h>

int main (int argc, char **argv)
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    int i = 1;  

    NSLog(@"Hi GDB, i is %@", i);

    [pool release];
    return 0;
}

それから私はそれをコンパイルします: gcc -Wall -g -framework Foundation testGdb.m -o testGdb、そして私はそれを実行します:

gdb ./a.out 
GNU gdb 6.3.50-20050815 (Apple version gdb-1518) (Sat Feb 12 02:52:12 UTC 2011)
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) run
Starting program: /Users/Tarek/Desktop/a.out 
Reading symbols for shared libraries .++++....................... done

Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: KERN_INVALID_ADDRESS at address: 0x000000000000002a
0x00007fff82d7a0a3 in objc_msgSend_fixup ()
(gdb) bt
#0  0x00007fff82d7a0a3 in objc_msgSend_fixup ()
#1  0x0000000000000000 in ?? ()

(gdb)

奇妙なことに、(#1) には名前がなく、正しい出力では通常 NSLog (クラッシュの原因) と main が出力されます。

この奇妙な動作を理解していただきありがとうございます。

4

1 に答える 1

1

この答えは、おそらくここでも当てはまります。

デバッグ シンボルは問題とは何の関係もありません。GDB は、デバッグ シンボルがなくてもスタックを巻き戻すことができます (巻き戻し記述子のみが必要です)。

于 2011-06-28T02:28:18.787 に答える