我目前正在尝试调试 V8,以防万一有人有任何见解,我也会解释这个问题,但这与问题无关。
我有一个捆绑的 JavaScript 文件,可以用作解析器,所以类似于:
let data = "3";
let po = new ParseOptions();
let ds = new DiagnosticSink();
let ps = new Parser().parseSourceFile(data, po, ds);
当我调用
.parseSourceFile
时,就会发生致命错误,但它似乎只在我有多个令牌时才会发生,即:上面的内容没问题,但如果 data
是 3 + 5
或 a = 3
,那就会了错误。当通过节点运行它时,我只是得到一个类似的 AST(具有更多节点)。
错误是:
#
# Fatal error in ../../src/objects/intl-objects.cc, line 2478
# Debug check failed: U_SUCCESS(status).
#
#
#
#FailureMessage Object: 0x7ffc0cb58460
==== C stack trace ===============================
./a.out() [0x182c9e6]
./a.out() [0x41966b]
./a.out() [0x181c90b]
./a.out() [0x181c935]
./a.out() [0x8215a0]
./a.out() [0x18e4379]
./a.out() [0x18eccbd]
./a.out() [0x12486ff]
Trace/breakpoint trap (core dumped)
我想使用
gdb
来单步执行 V8 内部的代码,看看我是否可以理解该错误,因为查看 source 并不能帮助我具体理解这个问题。问题是它只显示 ASM 代码,并且我已确保使用 is_debug=true
标志编译 V8。有没有其他方法我应该配音 V8,有没有一种方法可以构建 V8 以便我可以使用 gdb
?
(这里是 V8 开发者。)
将 GDB 与 V8 一起使用是绝对可能的,重要的 GN arg 是
v8_optimized_debug = false
(除了 is_debug = true
)。如果您使用便捷的工作流程,您会自动获得它。不需要更多的技巧;不过为了更加方便,您可能还需要包含来自您的 ~/.gdbinit
的 V8 的 gdbinit。
这看起来确实像 V8 中的错误,因此请随时在 crbug.com/v8/new 上提交错误并附上重现说明,团队中的某人会查看 - 如果最近版本仍然出现这种情况; 9.7已经很老了。当然,如果您能够进一步进行调试,那也很好,我们非常乐意接受补丁。