Причина «ошибки LLDB: не удалось применить побочные эффекты выражения: невозможно дематериализовать регистр x0 без кадраPython

Программы на Python
Ответить
Anonymous
 Причина «ошибки LLDB: не удалось применить побочные эффекты выражения: невозможно дематериализовать регистр x0 без кадра

Сообщение Anonymous »

В macOS с использованием lldb у меня есть следующее в функции Python, вызываемой через команду сценария, где я хотел бы po зарегистрировать x0 в Arm64 в состоянии, которое, как известно, приостановлено:

Код: Выделить всё

 print("Attempting to po register x0 in a known-stopped state via HandleCommand")
debugger.SetAsync(False)
process = exe_ctx.process
if process:
state = process.GetState()
print(f"process is ${process}")
if state == lldb.eStateStopped:
print("process is stopped")
thread = process.GetSelectedThread()
if thread:
print(f"thread is ${thread}")
frame = thread.GetSelectedFrame()
if frame:
print(f"frame is ${frame}")
symbol = frame.GetSymbol();
if symbol:
print(f"symbol is ${symbol}")
print("Trying po without explicit thread and frame select in command context")
lldb.debugger.HandleCommand("po $x0")
print("Trying po with explicit thread and frame select in command context")
lldb.debugger.HandleCommand(f"thread select {thread.GetIndexID()}")
lldb.debugger.HandleCommand(f"frame select {frame.GetFrameID()}")
lldb.debugger.HandleCommand("po $x0")
else:
print("no symbol")
else:
print("no frame")
else:
print("no thread")
else:
print(f"state is not stopped, it is ${state}")
else:
print("no process")
print("Done attempting to po register x0 in a known-stopped state via HandleCommand")
Обычно (но не на 100% детерминировано) выводится ошибка:

Не удалось применить побочные эффекты выражения: невозможно дематериализовать регистр x0 без кадра стека.

Иногда ошибка:

Не удалось Materialize: не удалось прочитать значение регистра x0
ошибка: ошибка в DoExecute, не удалось подготовить тоExecuteJITExpression.

Когда сценарий завершается вскоре после этой попытки, всегда можно успешно выполнить команду $x0 в интерактивном режиме в lldb. Полагаю, я также видел, как функция Python в очень редких случаях успешно выполняла po.
Вот три примера вывода, показывающие сначала вывод сценария, а затем результат моего простого ввода po в приостановленную lldb после завершения функции.

Код: Выделить всё

Attempting to po register x0 in a known-stopped state via HandleCommand
process is $SBProcess: pid = 86947, state = stopped, threads = 4, executable = MyApp
process is stopped
thread is $thread #1: tid = 0xd64c3, 0x0000000100abc690 MyApp`sub_10002c690, queue = 'com.apple.main-thread', stop reason = breakpoint 1.823
frame is $frame #0: 0x0000000100abc690 MyApp`sub_10002c690
symbol is $id = {0x00000000}, range = [0x000000010002c690-0x000000010002c6c8), name="sub_10002c690"
frame #0: 0x0000000100abc690 MyApp`sub_10002c690
MyApp`sub_10002c690:
->  0x100abc690 :  ret
0x100abc694 :  stp    x20, x19, [sp, #-0x20]!
0x100abc698 :  stp    x29, x30, [sp, #0x10]
0x100abc69c : add    x29, sp, #0x10
* thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 1.823
frame #0: 0x0000000100abc690 MyApp`sub_10002c690
MyApp`sub_10002c690:
->  0x100abc690 :  ret
0x100abc694 :  stp    x20, x19, [sp, #-0x20]!
0x100abc698 :  stp    x29, x30, [sp, #0x10]
0x100abc69c : add    x29, sp, #0x10
error: Couldn't apply expression side effects : couldn't dematerialize register x0 without a stack frame
Done attempting to po register x0 in a known-stopped state via HandleCommand

(lldb) po $x0
4306298192

Attempting to po register x0 in a known-stopped state via HandleCommand
process is $SBProcess: pid = 86947, state = stopped, threads = 4, executable = MyApp
process is stopped
thread is $thread #1: tid = 0xd64c3, 0x0000000100abbc50 MyApp`sub_10002bc50, queue = 'com.apple.main-thread', stop reason = breakpoint 1.777
frame is $frame #0: 0x0000000100abbc50 MyApp`sub_10002bc50
symbol is $id = {0x00000000}, range = [0x000000010002bc50-0x000000010002bc60), name="sub_10002bc50"
frame #0: 0x0000000100abbc50 MyApp`sub_10002bc50
MyApp`sub_10002bc50:
->  0x100abbc50 :  adrp   x0, 19
0x100abbc54 :  add    x0, x0, #0x340
0x100abbc58 :  mov    x1, #0x0 ; =0
0x100abbc5c : ret
* thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 1.777
frame #0: 0x0000000100abbc50 MyApp`sub_10002bc50
MyApp`sub_10002bc50:
->  0x100abbc50 :  adrp   x0, 19
0x100abbc54 :  add    x0, x0, #0x340
0x100abbc58 :  mov    x1, #0x0 ; =0
0x100abbc5c : ret
error: Couldn't apply expression side effects : couldn't dematerialize register x0 without a stack frame
Done attempting to po register x0 in a known-stopped state via HandleCommand

(lldb) po $x0
255

Attempting to po register x0 in a known-stopped state via HandleCommand
process is $SBProcess: pid = 86947, state = stopped, threads = 4, executable = MyApp
process is stopped
thread is $thread #1: tid = 0xd64c3, 0x0000000100a941c8 MyApp`sub_1000041c8, queue = 'com.apple.main-thread', stop reason = breakpoint 1.4
frame is $frame #0: 0x0000000100a941c8 MyApp`sub_1000041c8
symbol is $id = {0x00000000}, range = [0x00000001000041c8-0x000000010000420c), name="sub_1000041c8"
frame #0: 0x0000000100a941c8 MyApp`sub_1000041c8
MyApp`sub_1000041c8:
->  0x100a941c8 :  stp    x20, x19, [sp, #-0x20]!
0x100a941cc :  stp    x29, x30, [sp, #0x10]
0x100a941d0 :  add    x29, sp, #0x10
0x100a941d4 : mov    x19, x0
* thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 1.4
frame #0: 0x0000000100a941c8 MyApp`sub_1000041c8
MyApp`sub_1000041c8:
->   0x100a941c8 :  stp    x20, x19, [sp, #-0x20]!
0x100a941cc :  stp    x29, x30, [sp, #0x10]
0x100a941d0 :  add    x29, sp, #0x10
0x100a941d4 : mov    x19, x0
error: Couldn't materialize: couldn't read the value of register x0
error: errored out in DoExecute, couldn't PrepareToExecuteJITExpression
Done attempting to po register x0 in a known-stopped state via HandleCommand

(lldb) po $x0
4306314120
Я также пробовал просто позвонить: чтобы гарантировать контекст (по крайней мере, я так думал), и я попытался вызвать команду с помощью CommandInterpreter, а не напрямую в отладчике.HandleCommand(). Я также попробовал проверить актуальность нити и фрейма, прежде чем продолжить. Как я ошибаюсь?
Моя версия LLDB — это версия /usr/bin/lldb (не через Xcode, но версия Xcode тоже делает это), и это lldb-1700.0.9.502, Apple Swift версии 6.1.2 (swiftlang-6.1.2.1.2) clang-1700.0.13.5)
Это происходит с оптимизированным, удаленным Arm64, но я не думаю, что это проблема, поскольку po выполняется в интерактивном режиме. Устройство, на котором запущен исполняемый файл, является удаленным, на всякий случай упомяните об этом.
Спасибо за любую помощь!

Подробнее здесь: https://stackoverflow.com/questions/798 ... t-demateri
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»