gpt4 book ai didi

crash - 编写 LLDB 脚本以在崩溃后获取堆栈跟踪

转载 作者:行者123 更新时间:2023-12-03 15:23:37 26 4
gpt4 key购买 nike

我正在尝试添加在我们的一个测试崩溃时自动从 mac 上的核心转储生成堆栈跟踪的功能。

我能够在 linux 上很容易地做到这一点

gdb --batch --quiet -ex "thread apply all bt" -ex "quit" <binary> <core file> 2> /dev/null

但是我在使用 lldb 的 mac(OSX 10.8)上做同样的事情时遇到了一些麻烦。首先,我使用的 lldb 版本是 lldb-310.2.37。

我最初的方法是使用 -s选项并传入一个脚本文件,如下所示:
target create -c <core file> <binary>
thread backtrace all
quit

最初我遇到了一些问题,我认为这是由于脚本文件末尾缺少换行符导致 lldb 无法退出引起的,但是在修复之后,我得到以下信息:
在 'lldbSource' 中执行命令。
(lldb)  target create -c <core file> <binary>
Core file '<core file>' (x86_64) was loaded.
(lldb) thread backtrace all
error: Aborting reading of commands after command #1: 'thread backtrace all' failed with error: invalid thread
Aborting after_file command execution, command file: 'lldbSource' failed.

有趣的是,在那之后,我们仍在运行 lldb,并且手动发出“thread backtrace all”可以正常工作。

所以,方法#2 是创建一个 python 脚本并使用他们的 python API(我在弄清楚我描述的初始阻止程序是由于缺少换行符之前尝试过这个)。

我的脚本:
import lldb
debugger = lldb.SBDebugger.Create()
target = debugger.CreateTarget('<binary>')
if target:
process = target.LoadCore('<core file>')
if process:
print process.exit_description
for thread in process:
print 'Thread %s:' % str(thread.GetThreadID())
print '\n'.join(str(frame) for frame in thread)

我用这种方法遇到的问题是 process.exit_description正在返回 None (我尝试过的所有其他事情也是如此;LLDB 的 python API 文档几乎完全没用)。

我正在从该调用中查找的输出类似于以下内容:
Process 0 stopped
* thread #1: tid = 0x0000, 0x00007fff8aca4670 libsystem_c.dylib`strlen + 16, stop reason = signal SIGSTOP
frame #0: 0x00007fff8aca4670 libsystem_c.dylib`strlen + 16
libsystem_c.dylib`strlen + 16:
-> 0x7fff8aca4670: pcmpeqb (%rdi), %xmm0
0x7fff8aca4674: andl $0xf, %ecx
0x7fff8aca4677: shll %cl, %eax
0x7fff8aca4679: pmovmskb %xmm0, %ecx

这是在加载核心文件时由 LLDB 自动输出的。我不一定需要程序集转储,但我至少需要线程、框架和原因。

我认为我使用的第一种方法,如果它可以工作的话,将是理想的,但无论哪种方式对我来说都可以。不幸的是,我无法控制将要使用的 LLDB 版本,所以我不能只更新到最新版本,看看它是否是一个已修复的错误。

也欢迎其他获得所需输出的方法。对于上下文,这将从 perl 脚本调用。

最佳答案

来自 lldb.llvm.org 的 TOT lldb 有一个新的“--batch”模式,它的工作方式与 gdb 批处理模式非常相似,并修复了一些使命令行源命令表现得更好的错误。如果您可以构建自己的 lldb,那么您现在就可以获得这些修复程序,否则您将不得不等到下一次 Xcode 更新。

exit_description 是 None 因为你的进程没有退出,它崩溃了。请注意,至少在 OS X 上,当进程崩溃时,多个线程可能同时发生异常,说进程崩溃并没有真正有用。你必须问线程。 lldb 在线程停止时打印出的停止状态可通过 GetStatus 方法获得。

stream = lldb.SBStream()
process.threads[0].GetStatus(stream)
print stream.GetData()

这似乎没有非常有用的帮助字符串。

关于crash - 编写 LLDB 脚本以在崩溃后获取堆栈跟踪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26812047/

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