LLDB:使用 python api 在函数开始的偏移处设置断点
LLDB: Set breakpoint at offset from function start using python api
我有一个设置简单的 lldb python 模块:
def __lldb_init_module (debugger, dict):
target = debugger.GetSelectedTarget()
target.DeleteAllBreakpoints()
process = target.GetProcess()
我可以使用以下方法轻松地在函数开始处设置断点:
breakpoint = target.BreakpointCreateByName("functionName", "moduleName")
breakpoint.SetScriptCallbackFunction( "python_module.bp_hit" )
我知道这是有效的,因为我的 bp_hit 函数被正确调用了。
但是,我确实需要将断点设置在距函数名称地址开始的 X 字节处。如果我知道 functionName 的地址,我可以简单地将 X 添加到地址并使用 BreakpointCreateByAddress。
将为我提供 functionName 地址的 python 代码是什么?
使用 SBTarget::FindFunctions 查找与您的函数名称匹配的 SBSymbolContext。 returns 一个 SBSymbolContext 匹配列表(因为可能有多个。)SBSymbolContext::GetStartAddress 将为您提供该符号开头的 SBAddress。然后使用 SBAddress::OffsetAddress 添加您的偏移量。有一个 SBTarget::CreateBreakpointByAddress 但令人讨厌的是它只需要一个 lldb::addr_t 而不是 SBAddress。您可以通过传入目标的 SBAddress::GetLoadAddress() 从 SBAddress 获得 lldb::addr_t。
吉姆答案的替代方法是使用 SBTarget 的 FindSymbols 函数。
我有一个设置简单的 lldb python 模块:
def __lldb_init_module (debugger, dict):
target = debugger.GetSelectedTarget()
target.DeleteAllBreakpoints()
process = target.GetProcess()
我可以使用以下方法轻松地在函数开始处设置断点:
breakpoint = target.BreakpointCreateByName("functionName", "moduleName")
breakpoint.SetScriptCallbackFunction( "python_module.bp_hit" )
我知道这是有效的,因为我的 bp_hit 函数被正确调用了。
但是,我确实需要将断点设置在距函数名称地址开始的 X 字节处。如果我知道 functionName 的地址,我可以简单地将 X 添加到地址并使用 BreakpointCreateByAddress。
将为我提供 functionName 地址的 python 代码是什么?
使用 SBTarget::FindFunctions 查找与您的函数名称匹配的 SBSymbolContext。 returns 一个 SBSymbolContext 匹配列表(因为可能有多个。)SBSymbolContext::GetStartAddress 将为您提供该符号开头的 SBAddress。然后使用 SBAddress::OffsetAddress 添加您的偏移量。有一个 SBTarget::CreateBreakpointByAddress 但令人讨厌的是它只需要一个 lldb::addr_t 而不是 SBAddress。您可以通过传入目标的 SBAddress::GetLoadAddress() 从 SBAddress 获得 lldb::addr_t。
吉姆答案的替代方法是使用 SBTarget 的 FindSymbols 函数。