问题标签 [mach]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
115 浏览

ios - Xcode *Apple Mach-0 错误

收到此错误,我不确定我在几周内没有触及这个项目的问题是什么,感谢任何帮助......

在此处查看图片 http://s24.postimg.org/nmsnnsxol/Screen_Shot_2014_04_03_at_21_50_32.png http://s21.postimg.org/jmfzvludj/Screen_Shot_2014_04_03_at_21_50_55.png

0 投票
2 回答
1505 浏览

macos - Delphi - 在 OSX 上获取完整的堆栈跟踪

我有一个可以记录堆栈跟踪的应用程序,以后可以用于调试。

在 Windows 上,我使用了 JEDI 项目提供的出色的 JCLDebug 单元。

现在我的应用程序在 OSX 上运行,我遇到了一些麻烦——我不知道在发生异常时如何获取正确的堆栈跟踪。

我已经掌握了基础知识-

1)我可以使用'backtrace'(在libSystem.dylib中找到)获得堆栈跟踪

2) 可以使用 Delphi 的链接器提供的 .map 文件将生成的回溯转换为行号

我剩下的问题是 - 我不知道从哪里调用回溯。我知道 Delphi 使用 Mach 异常(在单独的线程上),并且我不能使用 posix 信号,但这就是我设法解决的所有问题。

我可以在“try...except”块中获得回溯,但不幸的是,到那时堆栈已经结束了。

如何安装正确的异常记录器,它将在异常发生后立即运行?

更新:

根据“Honza R”的建议,我查看了“GetExceptionStackInfoProc”程序。

这个函数确实让我“深入”了异常处理过程,但不幸的是,我遇到了一些以前遇到的相同问题。

首先——在桌面平台上,这个函数'GetExceptionStackInfoProc'只是一个函数指针,你可以用你自己的异常信息处理程序来分配它。所以开箱即用,Delphi 不提供任何堆栈信息提供程序。

如果我将一个函数分配给“GetExceptionStackInfoProc”,然后在其中运行一个“回溯”,我会收到一个堆栈跟踪,但该跟踪是相对于异常处理程序,而不是导致异常的线程。

“GetExceptionStackInfoProc”确实包含指向“TExceptionRecord”的指针,但可用的文档非常有限。

我可能超出了我的深度,但是如何从正确的线程获取堆栈跟踪?我是否可以将自己的“回溯”函数注入异常处理程序,然后从那里返回到标准异常处理程序?

更新 2

更多细节。需要澄清的一件事 - 这个问题是关于由 MACH 消息处理的异常,而不是完全在 RTL 内处理的软件异常。

Embarcadero 已经列出了一些评论以及这些功能 -

这似乎是我遇到的问题的原因。

当我在此异常系统将控制权移交给 RTL 之后执行堆栈跟踪时,它看起来像这样 - (请记住,堆栈展开器已被回溯例程取代。回溯将控制权移交给展开器完全的)

由于RaiseSignalExceptionis 调用SignalConverter,我被引导相信backtracelibc 提供的函数与对堆栈所做的修改不兼容。因此,它无法读取超出该点的堆栈,但堆栈仍然存在于下方。

有谁知道该怎么做(或者我的假设是否正确)?

更新 3

我终于设法在 OSX 上获得了正确的堆栈跟踪。非常感谢 Honza 和 Sebastian。通过结合他们的两种技术,我发现了一些可行的方法。

对于其他可以从中受益的人,这里是基本来源。请记住,我不太确定它是否 100% 正确,如果您可以提出改进建议,请继续。这种技术在 Delphi 解开故障线程上的堆栈之前挂钩到异常,并补偿可能事先发生的任何堆栈帧损坏。

0 投票
0 回答
256 浏览

macos - 如何断开用户空间与内核扩展的连接(在内核端)

在我目前支持的内核扩展中,我使用套接字与用户空间进行通信。所以,我订阅了一些回调并正确处理它们

一切都按预期工作。只有一个问题 - 如果连接了用户空间客户端,我无法卸载我的内核扩展(ctl_deregister(kctlref) 返回错误)

有没有办法在内核扩展中覆盖它?我想与所有客户断开连接并成功注销自己

0 投票
0 回答
448 浏览

macos - OSX 中的 Breakpad:检查崩溃的进程失败

我试图弄清楚为什么在 OSX 10.8 上检查崩溃的进程失败。我正在将 Breakpad 添加到一个非常庞大且复杂的专业应用程序的 Mac 版本中。我目前正在使用 Breakpad r1035。由于我无法控制的情况,我的应用程序是使用 XCode 3.2.6 (GCC 4.2) 构建的。这可能是一个长镜头,因为最近在 SO 上的 Breakpad 标签下没有很多活动。

我已经对 Breakpad 代码进行了一些挖掘,以确定故障发生的确切位置。generator.Write(...)调用Inspector::InspectTask()返回 false 。在 内Write(),对 的调用会WriteMemoryListStream(...)导致进行ReadTaskMemory(...)系统mach_vm_read(...)调用,该系统调用具有稍后由 Inspector 报告的错误:Error writing minidump - errno=No such process

是否有原因导致崩溃过程不存在,或者 Inspector 无法正确检测到它?我尝试将@BREAKPAD_SEND_AND_EXIT设置更改为“否”,但这并没有什么不同。每次我导致崩溃时都会生成一个 2MB 的 .dmp 文件,其中包含非人类可读的文本。

这是我引发崩溃时 Inspector 的标准输出:

这是我引发崩溃时 Inspector 的标准错误(已编辑以删除目录):

是否有人在将 Breakpad 添加到 Mac 上的应用程序时遇到过类似的问题?或者看到 mach_vm_read(...) 以类似的方式失败?

0 投票
1 回答
532 浏览

macos - 从 kext 订阅新进程创建并获取该进程的 pid

我正在尝试在我的 kext 中获取有关新创建进程的通知。根据在 Mac OS X 中获取进程创建通知,我已订阅 KAUTH_FILEOP_EXEC

但由于一些奇怪的原因,我只有 2 个参数可用 - vnode 和文件名(https://developer.apple.com/library/mac/technotes/tn2127/_index.html)。

那个时候应该已经创建了进程并且有一个pid,但是内核没有给我。

这个时候能不能拿到pid?

是否有其他方法可以从 kext 订阅新进程创建并获取该进程的 pid?

0 投票
1 回答
2266 浏览

multithreading - 在 OSX 上创建实时线程

我正在开发一个通过 USB 串行将数据传输到硬件设备的 OSX 应用程序。硬件有一个小的串行缓冲区,它以可变速率耗尽,并且应该始终保持非空。

我们在它自己的 NSThread 中有一个写循环,它检查硬件缓冲区是否已满,如果没有,则写入数据直到它满为止。大多数循环迭代不写任何东西,几乎不花时间,但它们有时可能需要几毫秒(与 CACurrentMediaTime 计时)。线程在每次迭代后休眠 100ns。(我知道睡眠时间似乎非常短,但如果我们把它加长,硬件就会开始数据匮乏。)

这在很多时候都很好用。但是,如果主线程或其他应用程序开始执行处理器密集型操作,则写入线程会变慢,并且无法以足够快的速度传输数据以防止设备队列清空。

所以,我们想让串行写入线程实时。我阅读了有关通过 Mach API 请求实时调度的 Apple 文档,然后尝试调整来自Chromium 源代码中的 SetPriorityRealtimeAudio(mach_port_t mach_thread_id) 的代码片段。

但是,这不起作用 - 应用程序仍然容易受到串行通信减速的影响。有任何想法吗?我不确定是否需要更改写入线程的行为,或者我是否传递了错误的线程策略参数,或者两者兼而有之。我尝试了各种周期/计算/约束值,并强制使用更一致的占空比(最大写入 100ns,然后休眠 100ns),但没有运气。

一个相关问题:如何直接检查线程的优先级,和/或判断它是否以实时方式开始,然后被降级而不是被提升?现在我只是根据硬件性能进行推断,所以很难准确地判断发生了什么。

0 投票
1 回答
362 浏览

macos - 在 OS X 上用于音频编程的任何低延迟(比马赫信号量)同步方法?

我目前正在使用 TPCircularBuffer 来同步解码来自外部库(libxmp:http://xmp.sourceforge.net/)的音频数据,通过 OS X 上的 AudioUnits API 播放它。

Mach 信号量用于在需要重新填充缓冲区时发出信号。

但是,当信号量被触发时,音频中似乎存在“间隙”(并且音频似乎播放得比平时慢)。

在这种情况下,是否可以使用任何延迟较低的同步方法?

概念验证在这里:https ://gist.github.com/douglas-carmichael/cda1117e42e917397ed7

这是我传递给回调的结构:

这是我创建信号量的方式:

这是播放循环:

这是渲染回调:

0 投票
1 回答
64 浏览

ios - Mach-O-Link 错误

我目前正在开发一个包含应用购买的应用。厌倦了在所有项目中复制粘贴相同的类文件,我决定创建一个静态库。

我遵循了网上一些关于如何为 IOS 创建静态库的可用指南,但我似乎总是遇到问题。

arm64架构显示同样的错误

我链接了库,添加了头文件。更新了标题搜索路径,更新了框架路径。不知道我还能做什么......我使用了以下脚本。

0 投票
1 回答
650 浏览

iphone - iPhone中的马赫异常

我有时会遇到以下异常:

我不知道这些例外是关于什么的。有人可以对此有所了解吗?

0 投票
0 回答
138 浏览

objective-c - 在 OS X 10.6 上使用 NSConnection 的 IPC

我开发了两个使用 IPC 相互通信的应用程序。这是服务器端和客户端的代码:

服务器:

客户:

问题是它不适用于 OS X 10.6。但在 10.7、10.8 和 10.9 上完美运行。这是我在 10.6 上收到的错误:

__NSAutoreleaseNoPool():NSCFDictionary 类的对象 0x10031a0f0 自动释放,没有适当的池 - 只是泄漏

__NSAutoreleaseNoPool():NSCFArray 类的对象 0x100330b50 自动释放,没有适当的池 - 只是泄漏

结果客户端没有传递适当的值。