代码之家  ›  专栏  ›  技术社区  ›  Rob Keniger

在罗塞塔运行垃圾回收应用程序时,如何调试崩溃?

  •  3
  • Rob Keniger  · 技术社区  · 16 年前

    我有一个面向10.5的通用应用程序,它使用垃圾回收。我正在为PPC、i386和x86_64构建。

    我没有访问物理powerpc机器的权限,所以我试图使用rosetta来确认应用程序的powerpc部分是否正常工作。

    但是,一旦应用程序在Rosetta启动,它就会立即崩溃,崩溃日志如下:

    Process:         FooApp [91567]
    Path:            /Users/rob/Development/src/FooApp/build/Release 64-bit/FooApp.app/Contents/MacOS/FooApp
    Identifier:      com.companyX.FooApp
    Version:         0.9 (build d540e05) (2)
    Code Type:       PPC (Translated)
    Parent Process:  launchd [708]
    
    Date/Time:       2010-04-09 18:32:23.962 +1000
    OS Version:      Mac OS X 10.6.3 (10D573)
    Report Version:  6
    
    Exception Type:  EXC_CRASH (SIGTRAP)
    Exception Codes: 0x0000000000000000, 0x0000000000000000
    Crashed Thread:  5
    
    ...snip non-relevant threads...
    
    Thread 5 Crashed:
    0   libSystem.B.dylib               0x8023656a __pthread_kill + 10
    1   libSystem.B.dylib               0x80235e17 pthread_kill + 95
    2   com.companyX.FooApp         0xb80bfb30 0xb8000000 + 785200
    3   com.companyX.FooApp         0xb80c0037 0xb8000000 + 786487
    4   com.companyX.FooApp         0xb80dd8e8 0xb8000000 + 907496
    5   com.companyX.FooApp         0xb8145397 spin_lock_wrapper + 1791
    6   com.companyX.FooApp         0xb801ceb7 0xb8000000 + 118455
    

    我在调试翻译的应用程序时使用了apple文档,以及 this page 当应用程序在rosetta中运行时,将gdb附加到它。应用程序在启动时立即进入调试器:

    Program received signal SIGTRAP, Trace/breakpoint trap.
    [Switching to thread 15107]
    0x9151fdd4 in auto_fatal ()
    (gdb) bt
    #0  0x9151fdd4 in auto_fatal ()
    #1  0x91536d84 in Auto::Thread::get_register_state ()
    #2  0x915372f8 in Auto::Thread::scan_other_thread ()
    #3  0x91529be4 in Auto::Zone::scan_registered_threads ()
    #4  0x91539114 in Auto::MemoryScanner::scan_thread_ranges ()
    #5  0x9153b000 in Auto::MemoryScanner::scan ()
    #6  0x9153049c in Auto::Zone::collect ()
    #7  0x915198f4 in auto_collect_internal ()
    #8  0x9151a094 in auto_collection_work ()
    #9  0x96687434 in _dispatch_call_block_and_release ()
    #10 0x9668912c in _dispatch_queue_drain ()
    #11 0x96689350 in _dispatch_queue_invoke ()
    #12 0x966895c0 in _dispatch_worker_thread2 ()
    #13 0x966896fc in _dispatch_worker_thread ()
    #14 0x965a97e8 in _pthread_body ()
    (gdb) 
    

    我不知道从哪里开始。看来垃圾收集器的故障非常严重。rosetta中是否不支持垃圾收集的powerpc应用程序?如果是的话,我在文件中看不到任何关于这个限制的内容。

    有人有什么想法吗?

    2 回复  |  直到 15 年前
        1
  •  2
  •   Rob Keniger    16 年前

    我现在已经确定垃圾收集的powerpc应用程序不能使用rosetta运行。在google搜索之后,我在cocoa dev邮件列表中发现了一些关于这个的信息,尽管苹果没有提供任何“官方”信息。

    我已经确认,即使是默认的cocoa应用程序模板应用程序,如果为带有垃圾收集的ppc编译,然后在rosetta下启动,也会立即崩溃。

    我必须说,这是非常令人沮丧的,没有提到这个限制,无论是在 Universal Binary Programming Guidelines (讨论了罗塞塔) Garbage Collection Programming Guide 或者豹APPKIT或基金会发布说明。运行时没有生成某种有用的错误消息也令人沮丧。

    由于leopard/rosetta/powerpc现在是“遗留技术”,我不认为针对这一遗漏提出错误会有多大好处,但希望这个答案能帮助那些遇到同样问题的人。

        2
  •  0
  •   wbyoung    15 年前

    一种测试方法是在应用程序启动时禁用垃圾收集器。

    [[NSGarbageCollector defaultCollector] disable];
    

    你会像疯了一样漏出来,但如果是小规模的测试,就可以了。一个警告是,你需要确保这是你的应用程序中发生的第一件事。在 main 是个不错的地方,但是如果你链接到在 +load 方法(或具有构造函数),您可能需要在框架中执行此操作(或插入库)。

    推荐文章