我有一个程序,它提供了我想在 lldb 中显示的上下文相关信息。出于说明目的,假设该程序简单如下:
#include <stdio.h>
const char * get_perform_stack() {
return "CARP-AND-RETURN-IF-VSAM-ERROR\nMAIN\n";
}
int main()
{
return 0;
}
在 lldb 会话中,中断 main 后,我可以运行:
(lldb) expression -l c -- (char *)get_perform_stack()
(char *) $2 = 0x00000000004005e8 "CARP-AND-RETURN-IF-VSAM-ERROR\nMAIN\n"
我想制作一个 lldb python 脚本来调用此函数,但将结果显示为两行:
CARP-AND-RETURN-IF-VSAM-ERROR
MAIN
给定这样一个带有换行符的字符串,我可以用纯Python将其标记为:
stack = "CARP-AND-RETURN-IF-VSAM-ERROR\nMAIN\n"
print(type(stack))
print(stack)
a = stack.splitlines()
for f in a:
print(f)
给出:
# python3 ./sp
<class 'str'>
CARP-AND-RETURN-IF-VSAM-ERROR
MAIN
CARP-AND-RETURN-IF-VSAM-ERROR
MAIN
我也可以使用 lldb python 代码获得此结果,但如果我放入相同类型的标记化代码,它在我的 lldb python 脚本中不起作用。示例:
import lldb
# (lldb) command script import ~/lldb/cobbt.py
# (lldb) script cobbt.main()
def main() -> None:
debugger = lldb.target.GetDebugger()
exprOptions = lldb.SBExpressionOptions()
c = lldb.SBLanguageRuntime_GetLanguageTypeFromString("c")
exprOptions.SetLanguage( c )
result = lldb.target.EvaluateExpression("(char *)get_perform_stack()", exprOptions)
print(type(result))
s = result.GetSummary()
print(type(s))
print(s)
stack = s.splitlines()
for f in stack:
print(f)
splitlines() 似乎没有做任何事情,我得到了一个元素:
(lldb) command script import ~/lldb/cobbt.py
(lldb) script cobbt.main()
<class 'lldb.SBValue'>
<class 'str'>
"CARP-AND-RETURN-IF-VSAM-ERROR\nMAIN\n"
"CARP-AND-RETURN-IF-VSAM-ERROR\nMAIN\n"
(lldb)
在这两种情况下,python 似乎都认为我尝试标记的结果是“class str”,但是 lldb 的 python 解释器内的行为与独立 python 的行为不同,我不确定有什么区别是,或者如何修复我的代码以单独显示结果?
供参考:我正在运行 lldb 版本 14.0.6,使用 python3 脚本支持构建。
lldb 结果不是 ' ' 字符,但有两个字符:'\'、'n'。我可以用这样的东西来代替:
stack = s.split('\\n')
i = 0
for f in stack:
print("{}.{}".format(i,f))
i += 1
这需要一些微调,因为我也必须删除“字符和最后一行,因为它给了我:
0."CARP-AND-RETURN-IF-VSAM-ERROR
1.MAIN
2."
但这可能不太难。