Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos OSX中的Breakpad:对崩溃进程的检查失败_Macos_Mach_Google Breakpad - Fatal编程技术网

Macos OSX中的Breakpad:对崩溃进程的检查失败

Macos OSX中的Breakpad:对崩溃进程的检查失败,macos,mach,google-breakpad,Macos,Mach,Google Breakpad,我正在试图弄清楚为什么OSX 10.8上对崩溃进程的检查失败了。我正在将Breakpad添加到一个非常庞大而复杂的专业应用程序的Mac版本中。我目前正在使用Breakpad r1035。由于我无法控制的情况,我的应用程序是使用XCode 3.2.6(GCC 4.2)构建的。这可能是一个长期的尝试,因为最近在Breakpad标签下没有太多活动 我对Breakpad代码进行了一些挖掘,以确定故障发生的确切位置。generator.Write(…)调用Inspector::InspectTask()返

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

我对Breakpad代码进行了一些挖掘,以确定故障发生的确切位置。
generator.Write(…)
调用
Inspector::InspectTask()
返回false。在
Write()
中,对
WriteMemoryListStream(…)
的调用将导致
ReadTaskMemory(…)
,这将进行
mach\u vm\u read(…)
系统调用,该调用稍后由检查器报告错误为:
error writing minidup-errno=无此类进程

是否存在崩溃过程不存在的原因,或者为什么检查员无法正确检测到崩溃过程?我已尝试将
@BREAKPAD\u SEND\u和\u EXIT
设置更改为“NO”,但这并没有产生任何影响。每次我导致崩溃时都会生成一个2MB.dmp文件,其中包含非人类可读的文本

这是当我引发碰撞时,Inspector发出的警告:

message ID = 0
exception_type = 1
exception_code = 1
exception_subcode = 0
remote_task = 7171
crashing_thread = 6915
handler_thread = 6659
ack_port_ = 6403
parameter count = 18
Inspector: sent acknowledgement (os/kern) successful (0)
以下是我导致崩溃时Inspector提供的stderr(编辑以删除目录):

挂起的远程任务
正在将小型转储写入目录()
小型转储路径(/DD6D8905-F55F-4035-96BA-25460453F236.dmp)
写入minidump时出错-errno=没有这样的进程
已恢复远程任务
检查员:正在尝试将确认发送到端口6403
对崩溃进程的检查失败

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

要从外部进程读取内存,您需要在某个时候获得对任务端口的发送权限(用mach的说法),并且操作系统限制可以这样做的应用程序。我认为规则自2010年以来没有改变,你可以找到它们。你知道你在这方面做得好吗?@zneak设置权限的代码已经作为框架的一部分存在。我对Mach的了解不足以排除发送权限,尽管其他人似乎使用Breakpad时没有遇到这个问题。有没有可能因为Mach发送权限而得到“没有这样的过程”错误?我找不到Mach_vm_read的任何官方文档,而且,我不认为有任何方法可以知道在哪些条件下返回了哪些错误。如果您想确定,您必须验证
task\u for\u pid
(或用于获取发送权限的任何其他技术)的结果是否正确<当您没有使用权限时,code>task\u for\u pid返回5((os/kern)failure)。我认为Breakpad总是在进程之外运行,但事实并非如此。它可以使用
mach\u task\u self()
获取当前进程的mach端口,并避开所有用于pid的任务,因此问题可能出在其他地方。@zneak我正在使用中断进程的Breakpad。据我所知,当处理异常时,主进程使用
mach_task_self()
收集信息,向进程外检查器任务发送mach消息。我不确定权限的具体配置位置,但主任务还创建了一个
ReceivePort
,它似乎支持双向通信。
Suspended Remote task
Writing minidump to directory (<correct location>)
minidump path (<correct location>/DD6D8905-F55F-4035-96BA-25460453F236.dmp)
Error writing minidump - errno=No such process
Resumed remote task
Inspector: trying to send acknowledgement to port 6403
Inspection of crashed process failed