Код: Выделить всё
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")
Не удалось применить побочные эффекты выражения: невозможно дематериализовать регистр 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
- и
Код: Выделить всё
lldb.debugger.HandleCommand("thread select 1") Код: Выделить всё
lldb.debugger.HandleCommand("frame select 0")
Моя версия 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
Мобильная версия