【问题标题】:How do I specify a message when calling abort() in C?在 C 中调用 abort() 时如何指定消息?
【发布时间】:2020-07-09 21:28:44
【问题描述】:

我尝试在一个非常旧的 MacOS 版本中打开 Minecraft。每次打开时,它都会显示 Minecraft Launcher 意外退出,并在底部显示一条自定义消息。

Exception Type: SIGABRT  
Exception Code: 0x000000000000 0x000000000000  
Exception Note: EXC_CORPSE_NOTIFY

Application Specific Information:  
abort() called  
Minecraft requires at least MacOS 10.9, and trying to run on 10.8.5

如何在我的代码中做同样的事情?如果我调用abort(),我如何指定在Application Quit Unexpectedly窗口的Application Specific Information下显示的原因?

【问题讨论】:

  • @Barmar 你确定吗? Minecraft Launcher 做到了,我不知道 Launcher 是用什么编写的,但如果我可以用 Launcher 编写的任何语言来做到这一点,我可能可以用 C 语言做到这一点。
  • 这不是标准 C 中 abort() 功能的一部分。“异常说明”似乎是特定于 MacOS(可能是特定语言)的东西,因此您应该相应地标记。
  • @machine_1 不,我只是将 Minecraft 用作一个应用程序示例,该应用程序执行我想知道的操作。
  • allocinit.net/blog/2008/01/04/… 看起来很相关,但说它没有记录。
  • 我不知道为什么这么多人说这另一个程序已经在做的事情是不可能的。显然这是可能的,因为另一个程序正在这样做!当然,它是特定于 Mac 的。

标签: c macos abort


【解决方案1】:

您不能使用abort() 函数调用指定任何消息。请参阅函数 abort 的 ANSIC 标准定义和描述。你会得到答案。
abort() 调用之前,将您想要的任何字符串消息写入stdoutstderr

#include <stdlib.h>
void abort(void);

abort 函数导致程序异常终止 发生,除非信号 SIGABRT 被捕获并且信号 处理程序不返回。是否打开未写入缓冲的流 数据被刷新,打开的流被关闭,或者临时文件被 删除是实现定义的。实现定义的 状态不成功终止的形式返回给 通过函数调用 raise(SIGABRT) 的主机环境。 abort 函数不会返回给它的调用者

【讨论】:

  • 不回答问题。显然 Minecraft 这样做了,所以它以某种方式成为可能。例如,它可能涉及调用另一个函数。并且消息写在之后“调用中止()”。请注意,这是一个特定于 Mac 的问题。
【解决方案2】:

没有办法用 abort 指定错误消息(或任何消息)。 abort 函数只是结束程序(类似于 exit 函数)。

打印到标准错误或在 abort 调用之前使用 assert 语句将是实现此功能的好方法。

【讨论】:

  • 不回答问题。显然 Minecraft 这样做了,所以它以某种方式成为可能。例如,它可能涉及调用另一个函数。并且消息写在“abort() called”之后。请注意,这是一个特定于 Mac 的问题。
猜你喜欢
  • 1970-01-01
  • 2022-06-23
  • 1970-01-01
  • 1970-01-01
  • 2017-02-01
  • 1970-01-01
  • 2019-08-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多