Я пытаюсь добавить возможность генерации трассировки стека из дампа ядра на Mac автоматически при выходе из строя одного из наших тестов.Сценарий LLDB для получения трассировки стека после сбоя
я был в состоянии сделать это довольно легко на Linux с
gdb --batch --quiet -ex "thread apply all bt" -ex "quit" <binary> <core file> 2> /dev/null
Но у меня возникают некоторые проблемы, делая то же самое на Mac (OSX 10.8) с lldb. Для начала версия 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, и выпуск «нить трассировки все» вручную работает просто отлично.
Итак, подход № 2 заключался в создании скрипта python и использовании их API-интерфейса python (я пробовал это, прежде чем выяснять, что начальный блокиратор, который я описал, был связан с отсутствующей новой строкой).
Мой сценарий:
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
(и поэтому каждый вещь, которую я пробовал, документация Python API LLDB является почти полностью бесполезна) ,
Выход Я ищу из этого вызова нечто похожее на следующее:
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.
Это сработало, спасибо. – Bwmat