【问题标题】:Debugging MacOSX Cocoa applications with command line gdb (without XCode)使用命令行 gdb(无 XCode)调试 MacOSX Cocoa 应用程序
【发布时间】:2023-03-06 01:19:01
【问题描述】:

我使用一个包含 Objective-C 的跨平台工具包,所以我不/不能使用 XCode。 只是纯命令行和普通的旧 makefile。

我使用“gcc -Wall -g -O0”编译我的源代码,但是在 gdb 控制下运行它时,我没有得到堆栈帧或有效的源代码行。

首先:我能做些什么来完成这项工作。 第二:如何使用 XCode (3.0) 为我提供 gdb 的 GUI 前端。

这是我在设置断点并执行“回溯”gdb 命令时得到的结果

0  0x918194a9 in malloc_error_break ()
#1  0x91814497 in szone_error ()
#2  0x9173e523 in szone_free ()
#3  0x9173e38d in free ()
#4  0x000d3c53 in Agui_Paint_Context::checkFontColor ()
#5  0x000b2c81 in Agui_Color_Button::attribute_table ()
#6  0x000e5b2e in Agui_Scroll_Canvas_Scrolling_Mixin::~Agui_Scroll_Canvas_Scrolling_Mixin ()
#7  0x000e8968 in Agui_Scroll_Canvas_Scrolling_Mixin::~Agui_Scroll_Canvas_Scrolling_Mixin ()
#8  0x000e8cd9 in Agui_Scroll_Canvas_Scrolling_Mixin::~Agui_Scroll_Canvas_Scrolling_Mixin ()
#9  0x93325e8f in -[NSApplication sendAction:to:from:] ()
#10 0x93325dcc in -[NSControl sendAction:to:] ()
#11 0x93325c52 in -[NSCell _sendActionFrom:] ()
#12 0x933252ab in -[NSCell trackMouse:inRect:ofView:untilMouseUp:] ()
#13 0x93324afe in -[NSButtonCell trackMouse:inRect:ofView:untilMouseUp:] ()
#14 0x933243b8 in -[NSControl mouseDown:] ()
#15 0x93322af7 in -[NSWindow sendEvent:] ()
#16 0x932ef6a5 in -[NSApplication sendEvent:] ()
#17 0x0008dc6e in Agui_Attribute_Type_Boolean::~Agui_Attribute_Type_Boolean ()
#18 0x9324cfe7 in -[NSApplication run] ()
#19 0x0008e6b7 in Agui_Attribute_Type_Boolean::~Agui_Attribute_Type_Boolean ()
#20 0x0003faba in ?? ()
#21 0x00073ddd in ?? ()
#22 0x0007c996 in ?? ()
#23 0x00004bb2 in ?? ()
#24 0x00002d76 in ?? ()
(gdb) 

“Agui_”函数确实存在,但它们是完全错误的。看起来文件/行关联已损坏。所以我必须先修复,然后才能从 XCode 获得任何有效的 GUI 支持。

更新:好的,我能够从 XCode 内部设置一个项目并调试应用程序,但这不是我真正想要的。即使我现在用 -gdwarf-2 更改了 -g,命令行调试仍然不起作用

【问题讨论】:

    标签: cocoa macos debugging gdb


    【解决方案1】:

    在 Xcode 中只需创建一个遗留的 makefile 项目,将源代码添加到项目中,最后设置一个自定义可执行文件(在 Executables 下)指向您构建的调试可执行文件。

    【讨论】:

    • 不起作用。在源文件中设置断点并不会停止程序。
    • 基于此以及您在原始问题中所说的话,听起来您的应用程序的某些部分没有在启用调试符号的情况下构建(或者它们可能在某些时候被剥离)?跨度>
    • 我可以保证所有文件都是用“gcc -Wall -g -O0”构建的,但问题是这是否足够。从 Linux 我知道 -g 是唯一必需的选项。在 MacOSX 上我遇到了问题。
    • 好吧,我只能告诉你,这种方法适用于使用 makefile 构建的遗留项目。您只需要确保自定义可执行文件设置正确,源文件与构建可执行文件时的位置相同,并且您的 C 标志中有 -g。
    • 要尝试的另一件事 - 直接在 gdb 中设置断点(在控制台中),例如b main,然后当你点击它时,看看它是否会调出包含 main 的源文件,然后尝试在源中设置其他断点,看看是否有效。
    【解决方案2】:

    当您尝试直接使用 GDB 时,您没有提供足够的信息来找出问题所在。 gdb 会话的记录会有所帮助(gdb ./foo、断点栏、运行、回溯)。

    您可以通过 Xcode 调试任何已经在运行的进程,方法是转到 Run > Attach to Process > Process ID...。如果您正在调试的问题在main() 内或以下的任何地方,您可以在main() 的开头引入对pause() 的调用以挂起您的进程并给您时间附加,然后只需向进程发出信号即可它继续。

    按照 Paul R. 的建议并建立一个 Xcode 项目要容易得多。 Xcode 确实可以用于编写、构建、运行和调试基于 make 的项目。您始终可以从一个空项目开始,然后添加源代码并自己创建构建目标。 Xcode 通过其 External Target 类型内置了对基于 make 的构建目标的支持,但即使不支持,您也可以使用 Shell Script 目标。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-11
      • 2011-01-10
      • 2014-11-09
      • 1970-01-01
      • 2013-01-28
      相关资源
      最近更新 更多