[Lldb-commits] [PATCH] D108953: [lldb/Plugins] Add memory region support in ScriptedProcess
This revision was landed with ongoing or failed builds. This revision was automatically updated to reflect the committed changes. Closed by commit rGa758c9f7204c: [lldb/Plugins] Add memory region support in ScriptedProcess (authored by mib). Changed prior to commit: https://reviews.llvm.org/D108953?vs=377724=378189#toc Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D108953/new/ https://reviews.llvm.org/D108953 Files: lldb/bindings/interface/SBMemoryRegionInfo.i lldb/bindings/interface/SBMemoryRegionInfoList.i lldb/bindings/python/python-wrapper.swig lldb/examples/python/scripted_process/main.stack-dump lldb/examples/python/scripted_process/my_scripted_process.py lldb/examples/python/scripted_process/scripted_process.py lldb/include/lldb/API/SBMemoryRegionInfo.h lldb/include/lldb/API/SBMemoryRegionInfoList.h lldb/include/lldb/Interpreter/ScriptInterpreter.h lldb/include/lldb/Interpreter/ScriptedProcessInterface.h lldb/source/API/SBMemoryRegionInfo.cpp lldb/source/API/SBMemoryRegionInfoList.cpp lldb/source/Interpreter/ScriptInterpreter.cpp lldb/source/Plugins/Process/scripted/ScriptedProcess.cpp lldb/source/Plugins/ScriptInterpreter/Python/SWIGPythonBridge.h lldb/source/Plugins/ScriptInterpreter/Python/ScriptedProcessPythonInterface.cpp lldb/source/Plugins/ScriptInterpreter/Python/ScriptedProcessPythonInterface.h lldb/source/Plugins/ScriptInterpreter/Python/ScriptedPythonInterface.cpp lldb/source/Plugins/ScriptInterpreter/Python/ScriptedPythonInterface.h lldb/test/API/functionalities/scripted_process/TestScriptedProcess.py lldb/test/API/functionalities/scripted_process/dummy_scripted_process.py lldb/test/API/functionalities/scripted_process/main.c lldb/unittests/ScriptInterpreter/Python/PythonTestSuite.cpp Index: lldb/unittests/ScriptInterpreter/Python/PythonTestSuite.cpp === --- lldb/unittests/ScriptInterpreter/Python/PythonTestSuite.cpp +++ lldb/unittests/ScriptInterpreter/Python/PythonTestSuite.cpp @@ -166,6 +166,10 @@ return nullptr; } +extern "C" void *LLDBSWIGPython_CastPyObjectToSBMemoryRegionInfo(void *data) { + return nullptr; +} + extern lldb::ValueObjectSP LLDBSWIGPython_GetValueObjectSPFromSBValue(void *data) { return nullptr; Index: lldb/test/API/functionalities/scripted_process/main.c === --- lldb/test/API/functionalities/scripted_process/main.c +++ lldb/test/API/functionalities/scripted_process/main.c @@ -1,5 +1,8 @@ -#include - -int main() { - return 0; // break here +int bar(int i) { + int j = i * i; + return j; // break here } + +int foo(int i) { return bar(i); } + +int main() { return foo(42); } Index: lldb/test/API/functionalities/scripted_process/dummy_scripted_process.py === --- lldb/test/API/functionalities/scripted_process/dummy_scripted_process.py +++ lldb/test/API/functionalities/scripted_process/dummy_scripted_process.py @@ -1,4 +1,4 @@ -import os,struct,signal +import os,struct, signal from typing import Any, Dict @@ -6,12 +6,12 @@ from lldb.plugins.scripted_process import ScriptedProcess from lldb.plugins.scripted_process import ScriptedThread -class MyScriptedProcess(ScriptedProcess): +class DummyScriptedProcess(ScriptedProcess): def __init__(self, target: lldb.SBTarget, args : lldb.SBStructuredData): super().__init__(target, args) def get_memory_region_containing_address(self, addr: int) -> lldb.SBMemoryRegionInfo: -return self.memory_regions[0] +return None def get_thread_with_id(self, tid: int): return {} @@ -39,10 +39,10 @@ return True def get_scripted_thread_plugin(self): -return MyScriptedThread.__module__ + "." + MyScriptedThread.__name__ +return DummyScriptedThread.__module__ + "." + DummyScriptedThread.__name__ -class MyScriptedThread(ScriptedThread): +class DummyScriptedThread(ScriptedThread): def __init__(self, target): super().__init__(target) @@ -50,7 +50,10 @@ return 0x19 def get_name(self) -> str: -return MyScriptedThread.__name__ + ".thread-1" +return DummyScriptedThread.__name__ + ".thread-1" + +def get_state(self) -> int: +return lldb.eStateStopped def get_stop_reason(self) -> Dict[str, Any]: return { "type": lldb.eStopReasonSignal, "data": { @@ -81,7 +84,7 @@ if not 'SKIP_SCRIPTED_PROCESS_LAUNCH' in os.environ: debugger.HandleCommand( "process launch -C %s.%s" % (__name__, - MyScriptedProcess.__name__)) + DummyScriptedProcess.__name__)) else: print("Name of the class that will manage the scripted process: '%s.%s'" -% (__name__, MyScriptedProcess.__name__)) \
[Lldb-commits] [PATCH] D108953: [lldb/Plugins] Add memory region support in ScriptedProcess
JDevlieghere accepted this revision. JDevlieghere added a comment. This revision is now accepted and ready to land. LGTM Comment at: lldb/examples/python/scripted_process/my_scripted_process.py:126 def get_register_context(self) -> str: -return struct.pack( -'21Q', 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21) +return struct.pack(f"{len(self.registers)}Q", *self.registers.values()) Aren't format strings only available in Python 3? Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D108953/new/ https://reviews.llvm.org/D108953 ___ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
[Lldb-commits] [PATCH] D108953: [lldb/Plugins] Add memory region support in ScriptedProcess
mib updated this revision to Diff 377724. mib added a comment. Return an Optional to stop fetching memory regions. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D108953/new/ https://reviews.llvm.org/D108953 Files: lldb/bindings/interface/SBMemoryRegionInfo.i lldb/bindings/interface/SBMemoryRegionInfoList.i lldb/bindings/python/python-wrapper.swig lldb/examples/python/scripted_process/main.stack-dump lldb/examples/python/scripted_process/my_scripted_process.py lldb/include/lldb/API/SBMemoryRegionInfo.h lldb/include/lldb/API/SBMemoryRegionInfoList.h lldb/include/lldb/Interpreter/ScriptInterpreter.h lldb/include/lldb/Interpreter/ScriptedProcessInterface.h lldb/source/API/SBMemoryRegionInfo.cpp lldb/source/API/SBMemoryRegionInfoList.cpp lldb/source/Interpreter/ScriptInterpreter.cpp lldb/source/Plugins/Process/scripted/ScriptedProcess.cpp lldb/source/Plugins/ScriptInterpreter/Python/SWIGPythonBridge.h lldb/source/Plugins/ScriptInterpreter/Python/ScriptedProcessPythonInterface.cpp lldb/source/Plugins/ScriptInterpreter/Python/ScriptedProcessPythonInterface.h lldb/source/Plugins/ScriptInterpreter/Python/ScriptedPythonInterface.cpp lldb/source/Plugins/ScriptInterpreter/Python/ScriptedPythonInterface.h lldb/test/API/functionalities/scripted_process/TestScriptedProcess.py lldb/test/API/functionalities/scripted_process/dummy_scripted_process.py lldb/test/API/functionalities/scripted_process/main.c lldb/unittests/ScriptInterpreter/Python/PythonTestSuite.cpp Index: lldb/unittests/ScriptInterpreter/Python/PythonTestSuite.cpp === --- lldb/unittests/ScriptInterpreter/Python/PythonTestSuite.cpp +++ lldb/unittests/ScriptInterpreter/Python/PythonTestSuite.cpp @@ -166,6 +166,10 @@ return nullptr; } +extern "C" void *LLDBSWIGPython_CastPyObjectToSBMemoryRegionInfo(void *data) { + return nullptr; +} + extern lldb::ValueObjectSP LLDBSWIGPython_GetValueObjectSPFromSBValue(void *data) { return nullptr; Index: lldb/test/API/functionalities/scripted_process/main.c === --- lldb/test/API/functionalities/scripted_process/main.c +++ lldb/test/API/functionalities/scripted_process/main.c @@ -1,5 +1,8 @@ -#include - -int main() { - return 0; // break here +int bar(int i) { + int j = i * i; + return j; // break here } + +int foo(int i) { return bar(i); } + +int main() { return foo(42); } Index: lldb/test/API/functionalities/scripted_process/dummy_scripted_process.py === --- /dev/null +++ lldb/test/API/functionalities/scripted_process/dummy_scripted_process.py @@ -0,0 +1,90 @@ +import os,struct, signal + +from typing import Any, Dict + +import lldb +from lldb.plugins.scripted_process import ScriptedProcess +from lldb.plugins.scripted_process import ScriptedThread + +class DummyScriptedProcess(ScriptedProcess): +def __init__(self, target: lldb.SBTarget, args : lldb.SBStructuredData): +super().__init__(target, args) + +def get_memory_region_containing_address(self, addr: int) -> lldb.SBMemoryRegionInfo: +return self.memory_regions[0] + +def get_thread_with_id(self, tid: int): +return {} + +def get_registers_for_thread(self, tid: int): +return {} + +def read_memory_at_address(self, addr: int, size: int) -> lldb.SBData: +data = lldb.SBData().CreateDataFromCString( +self.target.GetByteOrder(), +self.target.GetCodeByteSize(), +"Hello, world!") +return data + +def get_loaded_images(self): +return self.loaded_images + +def get_process_id(self) -> int: +return 42 + +def should_stop(self) -> bool: +return True + +def is_alive(self) -> bool: +return True + +def get_scripted_thread_plugin(self): +return DummyScriptedThread.__module__ + "." + DummyScriptedThread.__name__ + + +class DummyScriptedThread(ScriptedThread): +def __init__(self, target): +super().__init__(target) + +def get_thread_id(self) -> int: +return 0x19 + +def get_name(self) -> str: +return DummyScriptedThread.__name__ + ".thread-1" + +def get_state(self) -> int: +return lldb.eStateStopped + +def get_stop_reason(self) -> Dict[str, Any]: +return { "type": lldb.eStopReasonSignal, "data": { +"signal": signal.SIGINT +} } + +def get_stackframes(self): +class ScriptedStackFrame: +def __init__(idx, cfa, pc, symbol_ctx): +self.idx = idx +self.cfa = cfa +self.pc = pc +self.symbol_ctx = symbol_ctx + + +symbol_ctx = lldb.SBSymbolContext() +frame_zero = ScriptedStackFrame(0, 0x42424242,
[Lldb-commits] [PATCH] D108953: [lldb/Plugins] Add memory region support in ScriptedProcess
mib added inline comments. Comment at: lldb/source/Plugins/Process/scripted/ScriptedProcess.cpp:278 +if (error.Fail()) + return error; + JDevlieghere wrote: > If this is the only way out of this loop, does that mean we always return an > error here? In a previous diff, I stopped fetching memory regions if the `shared_ptr` was null, but now, I only have a memory region object instance which has no `IsValid` or `operator bool()` methods ... Not sure yet how I'll be able to fetch all the memory regions ... I'll have to rethink this. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D108953/new/ https://reviews.llvm.org/D108953 ___ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
[Lldb-commits] [PATCH] D108953: [lldb/Plugins] Add memory region support in ScriptedProcess
JDevlieghere added inline comments. Comment at: lldb/source/Plugins/Process/scripted/ScriptedProcess.cpp:278 +if (error.Fail()) + return error; + If this is the only way out of this loop, does that mean we always return an error here? Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D108953/new/ https://reviews.llvm.org/D108953 ___ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
[Lldb-commits] [PATCH] D108953: [lldb/Plugins] Add memory region support in ScriptedProcess
mib added a comment. ping @JDevlieghere Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D108953/new/ https://reviews.llvm.org/D108953 ___ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
[Lldb-commits] [PATCH] D108953: [lldb/Plugins] Add memory region support in ScriptedProcess
mib updated this revision to Diff 377326. mib edited the summary of this revision. mib added a comment. Reverted from `shared_ptr` to `unique_ptr` for SBMemoryRegionInfo opaque_ptr. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D108953/new/ https://reviews.llvm.org/D108953 Files: lldb/bindings/interface/SBMemoryRegionInfo.i lldb/bindings/interface/SBMemoryRegionInfoList.i lldb/bindings/python/python-wrapper.swig lldb/examples/python/scripted_process/main.stack-dump lldb/examples/python/scripted_process/my_scripted_process.py lldb/include/lldb/API/SBMemoryRegionInfo.h lldb/include/lldb/API/SBMemoryRegionInfoList.h lldb/include/lldb/Interpreter/ScriptInterpreter.h lldb/include/lldb/Interpreter/ScriptedProcessInterface.h lldb/source/API/SBMemoryRegionInfo.cpp lldb/source/API/SBMemoryRegionInfoList.cpp lldb/source/Interpreter/ScriptInterpreter.cpp lldb/source/Plugins/Process/scripted/ScriptedProcess.cpp lldb/source/Plugins/ScriptInterpreter/Python/SWIGPythonBridge.h lldb/source/Plugins/ScriptInterpreter/Python/ScriptedProcessPythonInterface.cpp lldb/source/Plugins/ScriptInterpreter/Python/ScriptedProcessPythonInterface.h lldb/source/Plugins/ScriptInterpreter/Python/ScriptedPythonInterface.cpp lldb/source/Plugins/ScriptInterpreter/Python/ScriptedPythonInterface.h lldb/test/API/functionalities/scripted_process/TestScriptedProcess.py lldb/test/API/functionalities/scripted_process/dummy_scripted_process.py lldb/test/API/functionalities/scripted_process/main.c lldb/unittests/ScriptInterpreter/Python/PythonTestSuite.cpp Index: lldb/unittests/ScriptInterpreter/Python/PythonTestSuite.cpp === --- lldb/unittests/ScriptInterpreter/Python/PythonTestSuite.cpp +++ lldb/unittests/ScriptInterpreter/Python/PythonTestSuite.cpp @@ -166,6 +166,10 @@ return nullptr; } +extern "C" void *LLDBSWIGPython_CastPyObjectToSBMemoryRegionInfo(void *data) { + return nullptr; +} + extern lldb::ValueObjectSP LLDBSWIGPython_GetValueObjectSPFromSBValue(void *data) { return nullptr; Index: lldb/test/API/functionalities/scripted_process/main.c === --- lldb/test/API/functionalities/scripted_process/main.c +++ lldb/test/API/functionalities/scripted_process/main.c @@ -1,5 +1,8 @@ -#include - -int main() { - return 0; // break here +int bar(int i) { + int j = i * i; + return j; // break here } + +int foo(int i) { return bar(i); } + +int main() { return foo(42); } Index: lldb/test/API/functionalities/scripted_process/dummy_scripted_process.py === --- /dev/null +++ lldb/test/API/functionalities/scripted_process/dummy_scripted_process.py @@ -0,0 +1,90 @@ +import os,struct, signal + +from typing import Any, Dict + +import lldb +from lldb.plugins.scripted_process import ScriptedProcess +from lldb.plugins.scripted_process import ScriptedThread + +class DummyScriptedProcess(ScriptedProcess): +def __init__(self, target: lldb.SBTarget, args : lldb.SBStructuredData): +super().__init__(target, args) + +def get_memory_region_containing_address(self, addr: int) -> lldb.SBMemoryRegionInfo: +return self.memory_regions[0] + +def get_thread_with_id(self, tid: int): +return {} + +def get_registers_for_thread(self, tid: int): +return {} + +def read_memory_at_address(self, addr: int, size: int) -> lldb.SBData: +data = lldb.SBData().CreateDataFromCString( +self.target.GetByteOrder(), +self.target.GetCodeByteSize(), +"Hello, world!") +return data + +def get_loaded_images(self): +return self.loaded_images + +def get_process_id(self) -> int: +return 42 + +def should_stop(self) -> bool: +return True + +def is_alive(self) -> bool: +return True + +def get_scripted_thread_plugin(self): +return DummyScriptedThread.__module__ + "." + DummyScriptedThread.__name__ + + +class DummyScriptedThread(ScriptedThread): +def __init__(self, target): +super().__init__(target) + +def get_thread_id(self) -> int: +return 0x19 + +def get_name(self) -> str: +return DummyScriptedThread.__name__ + ".thread-1" + +def get_state(self) -> int: +return lldb.eStateStopped + +def get_stop_reason(self) -> Dict[str, Any]: +return { "type": lldb.eStopReasonSignal, "data": { +"signal": signal.SIGINT +} } + +def get_stackframes(self): +class ScriptedStackFrame: +def __init__(idx, cfa, pc, symbol_ctx): +self.idx = idx +self.cfa = cfa +self.pc = pc +self.symbol_ctx = symbol_ctx + + +symbol_ctx =
[Lldb-commits] [PATCH] D108953: [lldb/Plugins] Add memory region support in ScriptedProcess
JDevlieghere added a comment. I'm slightly worried about the switch from a unique pointer to a shared pointer. It seems like a memory region is a simple enough object that it's warranted to make a copy to avoid this change. WDYT? Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D108953/new/ https://reviews.llvm.org/D108953 ___ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
[Lldb-commits] [PATCH] D108953: [lldb/Plugins] Add memory region support in ScriptedProcess
mib updated this revision to Diff 376509. mib added a comment. Update error message. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D108953/new/ https://reviews.llvm.org/D108953 Files: lldb/bindings/interface/SBMemoryRegionInfo.i lldb/bindings/interface/SBMemoryRegionInfoList.i lldb/bindings/python/python-wrapper.swig lldb/examples/python/scripted_process/main.stack-dump lldb/examples/python/scripted_process/my_scripted_process.py lldb/include/lldb/API/SBMemoryRegionInfo.h lldb/include/lldb/API/SBMemoryRegionInfoList.h lldb/include/lldb/Interpreter/ScriptInterpreter.h lldb/source/API/SBMemoryRegionInfo.cpp lldb/source/API/SBMemoryRegionInfoList.cpp lldb/source/Interpreter/ScriptInterpreter.cpp lldb/source/Plugins/Process/scripted/ScriptedProcess.cpp lldb/source/Plugins/ScriptInterpreter/Python/SWIGPythonBridge.h lldb/source/Plugins/ScriptInterpreter/Python/ScriptedProcessPythonInterface.cpp lldb/source/Plugins/ScriptInterpreter/Python/ScriptedPythonInterface.cpp lldb/source/Plugins/ScriptInterpreter/Python/ScriptedPythonInterface.h lldb/test/API/functionalities/scripted_process/TestScriptedProcess.py lldb/test/API/functionalities/scripted_process/dummy_scripted_process.py lldb/test/API/functionalities/scripted_process/main.c lldb/unittests/ScriptInterpreter/Python/PythonTestSuite.cpp Index: lldb/unittests/ScriptInterpreter/Python/PythonTestSuite.cpp === --- lldb/unittests/ScriptInterpreter/Python/PythonTestSuite.cpp +++ lldb/unittests/ScriptInterpreter/Python/PythonTestSuite.cpp @@ -166,6 +166,10 @@ return nullptr; } +extern "C" void *LLDBSWIGPython_CastPyObjectToSBMemoryRegionInfo(void *data) { + return nullptr; +} + extern lldb::ValueObjectSP LLDBSWIGPython_GetValueObjectSPFromSBValue(void *data) { return nullptr; Index: lldb/test/API/functionalities/scripted_process/main.c === --- lldb/test/API/functionalities/scripted_process/main.c +++ lldb/test/API/functionalities/scripted_process/main.c @@ -1,5 +1,8 @@ -#include - -int main() { - return 0; // break here +int bar(int i) { + int j = i * i; + return j; // break here } + +int foo(int i) { return bar(i); } + +int main() { return foo(42); } Index: lldb/test/API/functionalities/scripted_process/dummy_scripted_process.py === --- /dev/null +++ lldb/test/API/functionalities/scripted_process/dummy_scripted_process.py @@ -0,0 +1,90 @@ +import os,struct, signal + +from typing import Any, Dict + +import lldb +from lldb.plugins.scripted_process import ScriptedProcess +from lldb.plugins.scripted_process import ScriptedThread + +class DummyScriptedProcess(ScriptedProcess): +def __init__(self, target: lldb.SBTarget, args : lldb.SBStructuredData): +super().__init__(target, args) + +def get_memory_region_containing_address(self, addr: int) -> lldb.SBMemoryRegionInfo: +return self.memory_regions[0] + +def get_thread_with_id(self, tid: int): +return {} + +def get_registers_for_thread(self, tid: int): +return {} + +def read_memory_at_address(self, addr: int, size: int) -> lldb.SBData: +data = lldb.SBData().CreateDataFromCString( +self.target.GetByteOrder(), +self.target.GetCodeByteSize(), +"Hello, world!") +return data + +def get_loaded_images(self): +return self.loaded_images + +def get_process_id(self) -> int: +return 42 + +def should_stop(self) -> bool: +return True + +def is_alive(self) -> bool: +return True + +def get_scripted_thread_plugin(self): +return DummyScriptedThread.__module__ + "." + DummyScriptedThread.__name__ + + +class DummyScriptedThread(ScriptedThread): +def __init__(self, target): +super().__init__(target) + +def get_thread_id(self) -> int: +return 0x19 + +def get_name(self) -> str: +return DummyScriptedThread.__name__ + ".thread-1" + +def get_state(self) -> int: +return lldb.eStateStopped + +def get_stop_reason(self) -> Dict[str, Any]: +return { "type": lldb.eStopReasonSignal, "data": { +"signal": signal.SIGINT +} } + +def get_stackframes(self): +class ScriptedStackFrame: +def __init__(idx, cfa, pc, symbol_ctx): +self.idx = idx +self.cfa = cfa +self.pc = pc +self.symbol_ctx = symbol_ctx + + +symbol_ctx = lldb.SBSymbolContext() +frame_zero = ScriptedStackFrame(0, 0x42424242, 0x500, symbol_ctx) +self.frames.append(frame_zero) + +return self.frame_zero[0:0] + +def get_register_context(self) -> str: +return
[Lldb-commits] [PATCH] D108953: [lldb/Plugins] Add memory region support in ScriptedProcess
mib updated this revision to Diff 376508. mib added a comment. Use `ScriptedInterface::ErrorWithMessage` helper function. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D108953/new/ https://reviews.llvm.org/D108953 Files: lldb/bindings/interface/SBMemoryRegionInfo.i lldb/bindings/interface/SBMemoryRegionInfoList.i lldb/bindings/python/python-wrapper.swig lldb/examples/python/scripted_process/main.stack-dump lldb/examples/python/scripted_process/my_scripted_process.py lldb/include/lldb/API/SBMemoryRegionInfo.h lldb/include/lldb/API/SBMemoryRegionInfoList.h lldb/include/lldb/Interpreter/ScriptInterpreter.h lldb/source/API/SBMemoryRegionInfo.cpp lldb/source/API/SBMemoryRegionInfoList.cpp lldb/source/Interpreter/ScriptInterpreter.cpp lldb/source/Plugins/Process/scripted/ScriptedProcess.cpp lldb/source/Plugins/ScriptInterpreter/Python/SWIGPythonBridge.h lldb/source/Plugins/ScriptInterpreter/Python/ScriptedProcessPythonInterface.cpp lldb/source/Plugins/ScriptInterpreter/Python/ScriptedPythonInterface.cpp lldb/source/Plugins/ScriptInterpreter/Python/ScriptedPythonInterface.h lldb/test/API/functionalities/scripted_process/TestScriptedProcess.py lldb/test/API/functionalities/scripted_process/dummy_scripted_process.py lldb/test/API/functionalities/scripted_process/main.c lldb/unittests/ScriptInterpreter/Python/PythonTestSuite.cpp Index: lldb/unittests/ScriptInterpreter/Python/PythonTestSuite.cpp === --- lldb/unittests/ScriptInterpreter/Python/PythonTestSuite.cpp +++ lldb/unittests/ScriptInterpreter/Python/PythonTestSuite.cpp @@ -166,6 +166,10 @@ return nullptr; } +extern "C" void *LLDBSWIGPython_CastPyObjectToSBMemoryRegionInfo(void *data) { + return nullptr; +} + extern lldb::ValueObjectSP LLDBSWIGPython_GetValueObjectSPFromSBValue(void *data) { return nullptr; Index: lldb/test/API/functionalities/scripted_process/main.c === --- lldb/test/API/functionalities/scripted_process/main.c +++ lldb/test/API/functionalities/scripted_process/main.c @@ -1,5 +1,8 @@ -#include - -int main() { - return 0; // break here +int bar(int i) { + int j = i * i; + return j; // break here } + +int foo(int i) { return bar(i); } + +int main() { return foo(42); } Index: lldb/test/API/functionalities/scripted_process/dummy_scripted_process.py === --- /dev/null +++ lldb/test/API/functionalities/scripted_process/dummy_scripted_process.py @@ -0,0 +1,90 @@ +import os,struct, signal + +from typing import Any, Dict + +import lldb +from lldb.plugins.scripted_process import ScriptedProcess +from lldb.plugins.scripted_process import ScriptedThread + +class DummyScriptedProcess(ScriptedProcess): +def __init__(self, target: lldb.SBTarget, args : lldb.SBStructuredData): +super().__init__(target, args) + +def get_memory_region_containing_address(self, addr: int) -> lldb.SBMemoryRegionInfo: +return self.memory_regions[0] + +def get_thread_with_id(self, tid: int): +return {} + +def get_registers_for_thread(self, tid: int): +return {} + +def read_memory_at_address(self, addr: int, size: int) -> lldb.SBData: +data = lldb.SBData().CreateDataFromCString( +self.target.GetByteOrder(), +self.target.GetCodeByteSize(), +"Hello, world!") +return data + +def get_loaded_images(self): +return self.loaded_images + +def get_process_id(self) -> int: +return 42 + +def should_stop(self) -> bool: +return True + +def is_alive(self) -> bool: +return True + +def get_scripted_thread_plugin(self): +return DummyScriptedThread.__module__ + "." + DummyScriptedThread.__name__ + + +class DummyScriptedThread(ScriptedThread): +def __init__(self, target): +super().__init__(target) + +def get_thread_id(self) -> int: +return 0x19 + +def get_name(self) -> str: +return DummyScriptedThread.__name__ + ".thread-1" + +def get_state(self) -> int: +return lldb.eStateStopped + +def get_stop_reason(self) -> Dict[str, Any]: +return { "type": lldb.eStopReasonSignal, "data": { +"signal": signal.SIGINT +} } + +def get_stackframes(self): +class ScriptedStackFrame: +def __init__(idx, cfa, pc, symbol_ctx): +self.idx = idx +self.cfa = cfa +self.pc = pc +self.symbol_ctx = symbol_ctx + + +symbol_ctx = lldb.SBSymbolContext() +frame_zero = ScriptedStackFrame(0, 0x42424242, 0x500, symbol_ctx) +self.frames.append(frame_zero) + +return self.frame_zero[0:0] + +def
[Lldb-commits] [PATCH] D108953: [lldb/Plugins] Add memory region support in ScriptedProcess
mib added a comment. ping @JDevlieghere Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D108953/new/ https://reviews.llvm.org/D108953 ___ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
[Lldb-commits] [PATCH] D108953: [lldb/Plugins] Add memory region support in ScriptedProcess
mib added a comment. ping ? Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D108953/new/ https://reviews.llvm.org/D108953 ___ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
[Lldb-commits] [PATCH] D108953: [lldb/Plugins] Add memory region support in ScriptedProcess
mib added a comment. Following @JDevlieghere question in https://reviews.llvm.org/D107585#2979988, here are some explanations: In order to read memory from the ScriptedProcess, the process plugin calls the python `read_memory_at_address` method passing the address at which we should start reading (and the number of bytes to be read). However, the memory buffer, that provided by the python_script, - usually - starts at offset 0. This is why having memory regions in the python script allows up to: 1. Check that the address that should be read is in one of the our memory regions. 2. Shift the address by the region start address so the memory reads are done at the right location. Using a SB class for Scripted Processes could be risky, since it can introduce a cyclic dependency: If, for instance, we use a facility that is itself backed by an execution context object (process, thread, frame) for one of the Scripted execution context objects, that will cause the C++ object to use a Python object which will again use a C++ object, and so on. Luckily, this is not an issue for `lldb.SBMemoryRegionInfo`. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D108953/new/ https://reviews.llvm.org/D108953 ___ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
[Lldb-commits] [PATCH] D108953: [lldb/Plugins] Add memory region support in ScriptedProcess
mib updated this revision to Diff 370216. mib added a comment. Add test. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D108953/new/ https://reviews.llvm.org/D108953 Files: lldb/bindings/interface/SBMemoryRegionInfo.i lldb/bindings/interface/SBMemoryRegionInfoList.i lldb/bindings/python/python-wrapper.swig lldb/examples/python/scripted_process/main.stack-dump lldb/examples/python/scripted_process/my_scripted_process.py lldb/include/lldb/API/SBMemoryRegionInfo.h lldb/include/lldb/API/SBMemoryRegionInfoList.h lldb/include/lldb/Interpreter/ScriptInterpreter.h lldb/source/API/SBMemoryRegionInfo.cpp lldb/source/API/SBMemoryRegionInfoList.cpp lldb/source/Interpreter/ScriptInterpreter.cpp lldb/source/Plugins/Process/scripted/ScriptedProcess.cpp lldb/source/Plugins/ScriptInterpreter/Python/SWIGPythonBridge.h lldb/source/Plugins/ScriptInterpreter/Python/ScriptedProcessPythonInterface.cpp lldb/source/Plugins/ScriptInterpreter/Python/ScriptedPythonInterface.h lldb/test/API/functionalities/scripted_process/TestScriptedProcess.py lldb/test/API/functionalities/scripted_process/dummy_scripted_process.py lldb/test/API/functionalities/scripted_process/main.c lldb/unittests/ScriptInterpreter/Python/PythonTestSuite.cpp Index: lldb/unittests/ScriptInterpreter/Python/PythonTestSuite.cpp === --- lldb/unittests/ScriptInterpreter/Python/PythonTestSuite.cpp +++ lldb/unittests/ScriptInterpreter/Python/PythonTestSuite.cpp @@ -166,6 +166,10 @@ return nullptr; } +extern "C" void *LLDBSWIGPython_CastPyObjectToSBMemoryRegionInfo(void *data) { + return nullptr; +} + extern lldb::ValueObjectSP LLDBSWIGPython_GetValueObjectSPFromSBValue(void *data) { return nullptr; Index: lldb/test/API/functionalities/scripted_process/main.c === --- lldb/test/API/functionalities/scripted_process/main.c +++ lldb/test/API/functionalities/scripted_process/main.c @@ -1,5 +1,8 @@ -#include - -int main() { - return 0; // break here +int bar(int i) { + int j = i * i; + return j; // break here } + +int foo(int i) { return bar(i); } + +int main() { return foo(42); } Index: lldb/test/API/functionalities/scripted_process/dummy_scripted_process.py === --- /dev/null +++ lldb/test/API/functionalities/scripted_process/dummy_scripted_process.py @@ -0,0 +1,90 @@ +import os,struct, signal + +from typing import Any, Dict + +import lldb +from lldb.plugins.scripted_process import ScriptedProcess +from lldb.plugins.scripted_process import ScriptedThread + +class DummyScriptedProcess(ScriptedProcess): +def __init__(self, target: lldb.SBTarget, args : lldb.SBStructuredData): +super().__init__(target, args) + +def get_memory_region_containing_address(self, addr: int) -> lldb.SBMemoryRegionInfo: +return self.memory_regions[0] + +def get_thread_with_id(self, tid: int): +return {} + +def get_registers_for_thread(self, tid: int): +return {} + +def read_memory_at_address(self, addr: int, size: int) -> lldb.SBData: +data = lldb.SBData().CreateDataFromCString( +self.target.GetByteOrder(), +self.target.GetCodeByteSize(), +"Hello, world!") +return data + +def get_loaded_images(self): +return self.loaded_images + +def get_process_id(self) -> int: +return 42 + +def should_stop(self) -> bool: +return True + +def is_alive(self) -> bool: +return True + +def get_scripted_thread_plugin(self): +return DummyScriptedThread.__module__ + "." + DummyScriptedThread.__name__ + + +class DummyScriptedThread(ScriptedThread): +def __init__(self, target): +super().__init__(target) + +def get_thread_id(self) -> int: +return 0x19 + +def get_name(self) -> str: +return DummyScriptedThread.__name__ + ".thread-1" + +def get_state(self) -> int: +return lldb.eStateStopped + +def get_stop_reason(self) -> Dict[str, Any]: +return { "type": lldb.eStopReasonSignal, "data": { +"signal": signal.SIGINT +} } + +def get_stackframes(self): +class ScriptedStackFrame: +def __init__(idx, cfa, pc, symbol_ctx): +self.idx = idx +self.cfa = cfa +self.pc = pc +self.symbol_ctx = symbol_ctx + + +symbol_ctx = lldb.SBSymbolContext() +frame_zero = ScriptedStackFrame(0, 0x42424242, 0x500, symbol_ctx) +self.frames.append(frame_zero) + +return self.frame_zero[0:0] + +def get_register_context(self) -> str: +return struct.pack( +'21Q', 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
[Lldb-commits] [PATCH] D108953: [lldb/Plugins] Add memory region support in ScriptedProcess
mib created this revision. mib added reviewers: JDevlieghere, jasonmolenda, jingham. mib added a project: LLDB. mib requested review of this revision. Herald added a subscriber: lldb-commits. This patch adds support for memory regions in Scripted Processes. This is necessary to read the stack memory region in order to reconstruct each stackframe of the program. In order to do so, this patch makes some changes to the SBAPI, namely: - Add a new constructor for `SBMemoryRegionInfo` that takes arguments such as the memory region name, address range, permissions ... This is used when reading memory at some address to compute the offset in the binary blob provided by the user. - Change `SBMemoryRegionInfo` opaque pointer to a shared_ptr instead of unique_ptr so the ScriptInterpreter can extract the underlying `MemoryRegionInfo` object and pass it around. - Add a `GetMemoryRegionContainingAddress` method to `SBMemoryRegionInfoList` to simplify the access to a specific memory region. With these changes, lldb is now able to unwind the stack and reconstruct each frame. On top of that, reloading the target module at offset 0 allows lldb to symbolicate the `ScriptedProcess` using debug info, similarly to an ordinary Process. To test this, I wrote a simple program with multiple function calls, ran it in lldb, stopped at a leaf function and read the registers values and copied the stack memory into a binary file. These are then used in the python script. Signed-off-by: Med Ismail Bennani Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D108953 Files: lldb/bindings/interface/SBMemoryRegionInfo.i lldb/bindings/interface/SBMemoryRegionInfoList.i lldb/bindings/python/python-wrapper.swig lldb/examples/python/scripted_process/main.stack-dump lldb/examples/python/scripted_process/my_scripted_process.py lldb/include/lldb/API/SBMemoryRegionInfo.h lldb/include/lldb/API/SBMemoryRegionInfoList.h lldb/include/lldb/Interpreter/ScriptInterpreter.h lldb/source/API/SBMemoryRegionInfo.cpp lldb/source/API/SBMemoryRegionInfoList.cpp lldb/source/Interpreter/ScriptInterpreter.cpp lldb/source/Plugins/Process/scripted/ScriptedProcess.cpp lldb/source/Plugins/ScriptInterpreter/Python/SWIGPythonBridge.h lldb/source/Plugins/ScriptInterpreter/Python/ScriptedProcessPythonInterface.cpp lldb/source/Plugins/ScriptInterpreter/Python/ScriptedPythonInterface.h lldb/test/API/functionalities/scripted_process/main.c lldb/unittests/ScriptInterpreter/Python/PythonTestSuite.cpp Index: lldb/unittests/ScriptInterpreter/Python/PythonTestSuite.cpp === --- lldb/unittests/ScriptInterpreter/Python/PythonTestSuite.cpp +++ lldb/unittests/ScriptInterpreter/Python/PythonTestSuite.cpp @@ -166,6 +166,10 @@ return nullptr; } +extern "C" void *LLDBSWIGPython_CastPyObjectToSBMemoryRegionInfo(void *data) { + return nullptr; +} + extern lldb::ValueObjectSP LLDBSWIGPython_GetValueObjectSPFromSBValue(void *data) { return nullptr; Index: lldb/test/API/functionalities/scripted_process/main.c === --- lldb/test/API/functionalities/scripted_process/main.c +++ lldb/test/API/functionalities/scripted_process/main.c @@ -1,5 +1,8 @@ -#include - -int main() { - return 0; // break here +int bar(int i) { + int j = i * i; // break here + return j; } + +int foo(int i) { return bar(i); } + +int main() { return foo(42); } Index: lldb/source/Plugins/ScriptInterpreter/Python/ScriptedPythonInterface.h === --- lldb/source/Plugins/ScriptInterpreter/Python/ScriptedPythonInterface.h +++ lldb/source/Plugins/ScriptInterpreter/Python/ScriptedPythonInterface.h @@ -71,6 +71,23 @@ return m_interpreter.GetDataExtractorFromSBData(*sb_data); } + template <> + lldb::MemoryRegionInfoSP + ExtractValueFromPythonObject( + python::PythonObject , Status ) { +lldb::SBMemoryRegionInfo *sb_mem_region = +reinterpret_cast( +LLDBSWIGPython_CastPyObjectToSBMemoryRegionInfo(p.get())); + +if (!sb_mem_region) { + error.SetErrorString("Couldn't cast lldb::SBMemoryRegionInfo to " + "lldb::MemoryRegionInfoSP."); + return nullptr; +} + +return m_interpreter.GetOpaquePtrFromSBMemoryRegionInfo(*sb_mem_region); + } + template T Dispatch(llvm::StringRef method_name, Status , Args... args) { using namespace python; Index: lldb/source/Plugins/ScriptInterpreter/Python/ScriptedProcessPythonInterface.cpp === --- lldb/source/Plugins/ScriptInterpreter/Python/ScriptedProcessPythonInterface.cpp +++ lldb/source/Plugins/ScriptInterpreter/Python/ScriptedProcessPythonInterface.cpp @@ -95,8 +95,24 @@ lldb::MemoryRegionInfoSP ScriptedProcessPythonInterface::GetMemoryRegionContainingAddress( lldb::addr_t