В 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 без кадра стека». Иногда возникает ошибка: «Не удалось материализоваться: не удалось прочитать значение регистра 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
Я также пробовал просто вызывать lldb.debugger.HandleCommand("thread select 1") и lldb.debugger.HandleCommand("frame select 0"), чтобы гарантировать контекст (по крайней мере, я так думал), и я пробовал вызывать команду с помощью CommandInterpreter вместо непосредственно в debugger.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 работает в интерактивном режиме.
Спасибо за любую помощь!
В macOS с использованием lldb у меня есть следующее в функции Python, вызываемой через команду сценария, где я хотел бы po зарегистрировать x0 в Arm64 в состоянии, которое, как известно, приостановлено: [code] 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") [/code] Обычно (но не на 100% детерминировано) выводится ошибка «Не удалось применить побочные эффекты выражения: невозможно дематериализовать регистр x0 без кадра стека». Иногда возникает ошибка: «Не удалось материализоваться: не удалось прочитать значение регистра x0. Ошибка: произошла ошибка в DoExecute, не удалось подготовиться к ExecuteJITExpression». Когда сценарий завершается вскоре после этой попытки, всегда можно успешно выполнить команду $x0 в интерактивном режиме в lldb. Полагаю, я также видел, как функция Python в очень редких случаях успешно выполняла po. Вот три примера вывода, показывающие сначала вывод сценария, а затем результат моего простого ввода po в приостановленную lldb после выхода из функции. [code]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 [/code] Я также пробовал просто вызывать lldb.debugger.HandleCommand("thread select 1") и lldb.debugger.HandleCommand("frame select 0"), чтобы гарантировать контекст (по крайней мере, я так думал), и я пробовал вызывать команду с помощью CommandInterpreter вместо непосредственно в debugger.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 работает в интерактивном режиме. Спасибо за любую помощь!