lldb SBValue.GetSummary() 结果的 splitlines() 不起作用?

问题描述 投票:0回答:1

我有一个程序,它提供了我想在 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 脚本支持构建。

python lldb
1个回答
0
投票

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."

但这可能不太难。

© www.soinside.com 2019 - 2024. All rights reserved.