【问题标题】:GDB backtrace don't show function names on MacGDB 回溯不显示 Mac 上的函数名称
【发布时间】:2011-06-27 07:29:47
【问题描述】:

我用这个代码用 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。

感谢您帮助理解这种奇怪的行为。

【问题讨论】:

  • 您有调试符号可用于您的代码,但不适用于共享库。
  • 为什么会这样?你能给我解释一下原因吗?谢谢。
  • @funnycoder 默认情况下,从所有共享库中删除调试符号以节省空间strip(1)。如果有可能,请使用“-g”标志自己编译它们。要检查是否存在调试符号,请使用 nm -a /path/to/library
  • 我不明白你的意思!!我说的是一个简单的程序(不是库),我只是与 Foundation Framawork 链接。当我运行 nm 命令时,所有符号都存在。
  • 我无法准确解释原因,但这与编译器和运行时如何优化 x86_64 上的 Objective-C 2.0 中的某些方法调用有关 — 使用了一个内部 vtable,而不是传统的 Objective-C 消息调度机制。出于某种原因,方法修复代码会阻止调试器重建堆栈跟踪。如果你用-arch i386编译你的代码,它不使用vtables,你将能够得到回溯。

标签: objective-c debugging macos gdb backtrace


【解决方案1】:

This 答案很可能也适用于此。

调试符号与问题无关——没有它们,GDB 可以很好地展开堆栈(只需要展开描述符)。

【讨论】:

  • 如果我理解您在上一篇文章中的回答,我可以得出结论(Mac OS X Objective-c 库)没有展开描述符?这个问题是 X86_64 特有的吗?谢谢。
  • 它可能没有 正确 objc_msgSend_fixup 函数的展开描述符(它可能具有该库中其他函数的展开描述符)。问题是 x86_64 特有的,因为 GCC 在该架构上的优化代码中不使用帧指针。 GCC 4.6 也不在 i*86 上使用帧指针,所以问题(最终)也会在那里蔓延。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-23
  • 1970-01-01
  • 2012-01-13
  • 1970-01-01
相关资源
最近更新 更多