gpt4 book ai didi

c++ - 崩溃后如何处理 "impossible"堆栈跟踪?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:18:26 27 4
gpt4 key购买 nike

我的程序似乎遇到了一个非常难以重现的错误:难得一见,当用户将他的 Mac 置于休眠状态,然后再次将其唤醒时,我程序的一个子进程将崩溃Mac 唤醒后立即。

发生这种情况时,Apple 的崩溃报告机制会可靠地报告如下堆栈跟踪:

Thread 0 Crashed:: Dispatch queue: com.apple.main-thread
0 libsystem_kernel.dylib 0x967f9a6a __pthread_kill + 10
1 libsystem_c.dylib 0x9003dacf pthread_kill + 101
2 libsystem_c.dylib 0x900744f8 abort + 168
3 com.meyersound.VirtualD-Mitri 0x0014438e muscle::CrashSignalHandler(int) + 190
4 libsystem_c.dylib 0x9002886b _sigtramp + 43
5 ??? 0xffffffff 0 + 4294967295
6 com.meyersound.VirtualD-Mitri 0x001442d0 muscle::ParsePortArg(muscle::Message const&, muscle::String const&, unsigned short&, unsigned long) + 80
7 com.meyersound.VirtualD-Mitri 0x005b3393 qnet::RepDBPeer::Pulse(muscle::PulseNode::PulseArgs const&) + 1187
8 com.meyersound.VirtualD-Mitri 0x0015717b muscle::PulseNode::PulseAux(unsigned long long) + 203
9 com.meyersound.VirtualD-Mitri 0x000cfb90 muscle::ReflectServer::ServerProcessLoop() + 3232
10 com.meyersound.VirtualD-Mitri 0x00607c7e dcasldmain(int, char**) + 2222
11 com.meyersound.VirtualD-Mitri 0x0072c14d dmitridmain(int, char**) + 4749
12 com.meyersound.VirtualD-Mitri 0x0000bc3a main + 4938
13 com.meyersound.VirtualD-Mitri 0x000061ab _start + 209
14 com.meyersound.VirtualD-Mitri 0x000060d9 start + 41

这一切都很好,除了(提示诡异的音乐)——这在逻辑上是不可能的。特别是,不仅我的 RepDBPeer::Pulse() 方法从不调用 ParsePortArg,崩溃进程也从不调用 ParsePortArg 任何地方! (我对我所有的源代码进行了两次确认)

所以我的问题是,这个堆栈跟踪到底想告诉我什么?这是否很可能是线程 0 的堆栈严重损坏以致于堆栈跟踪机制已经偏离轨道并指责无辜的旁观者是罪魁祸首的情况?或者 Apple 的唤醒机制是否有可能以某种方式将程序计数器“跳转”到 ParsePortArg() 中(由此产生的困惑导致了崩溃)?还是这里发生了我什至无法想象的其他更深层次的魔法?

有问题的崩溃进程是一个普通的非 GUI 后台进程,它是一个由 Qt GUI 进程生成的子进程,这是值得的。

最佳答案

我假设您已开启一定程度的优化。没有什么魔法可以堆叠痕迹。一旦代码被内联或省略,它们就会变得越来越模糊(读作“不太准确”),这正是 C++ 优化器所做的。对于 ParsePortArg,该行末尾有一个 +80,表示代码段中该函数的入口点之前有 80 个字节。这表明指令指针的真实地址位于 0x001442d0ParsePortArg 是堆栈转储猜测的最接近的符号。您认为这是一条红鲱鱼是对的。

除非有任何其他数据,否则我会做出非常保守的猜测,即您的程序期望某个指针保持有效,而该指针在从 sleep 中唤醒时无效。查看该地址指令的反汇编。我敢打赌正在尝试读取内存地址。

关于c++ - 崩溃后如何处理 "impossible"堆栈跟踪?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16227845/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com