我已经从V8中调试CodeStubAssembler(CSA(代码中看到了解决问题的好答案。howerver,我真的无法理解这一点"然后,当CSA代码发出Turbofan IR图时,您可以逐步通过CSA代码,然后Turbofan后端将其转换为机器代码";在升级版中。我可以用这种方式根据源代码逐行调试CSA吗?为了更清楚地表达我的需求,我使用了一些代码示例:
2864 TNode<Smi> CodeStubAssembler::BuildAppendJSArray(ElementsKind kind,
2865 TNode<JSArray> array,
2866 CodeStubArguments* args,
2867 TVariable<IntPtrT>* arg_index,
2868 Label* bailout) {
2869 Comment("BuildAppendJSArray: ", ElementsKindToString(kind));
2870 Label pre_bailout(this);
2871 Label success(this);
2872 TVARIABLE(Smi, var_tagged_length);
以上是CSA中的代码,我可以在gdb中输入"n",然后从第2869行单步执行到第2870行吗?
需要明确的是,我可以获得以下格式来调试CSA代码吗?
[───────────────────────────────────────────────────────────────────────────────────────DISASM───────────────────────────────────────────────────────────────────────────────────────]
0x7f9fc9bcaca5 mov rax, qword ptr [rbp - 0x60]
0x7f9fc9bcaca9 mov rcx, qword ptr fs:[0x28]
0x7f9fc9bcacb2 mov rdx, qword ptr [rbp - 8]
0x7f9fc9bcacb6 cmp rcx, rdx
0x7f9fc9bcacb9 mov qword ptr [rbp - 0xb0], rax
► 0x7f9fc9bcacc0 jne 0x7f9fc9bcacd6
0x7f9fc9bcacc6 mov rax, qword ptr [rbp - 0xb0]
0x7f9fc9bcaccd add rsp, 0xb0
0x7f9fc9bcacd4 pop rbp
0x7f9fc9bcacd5 ret
0x7f9fc9bcacd6 call __stack_chk_fail@plt <0x7f9fcb191dc0>
[───────────────────────────────────────────────────────────────────────────────────────SOURCE───────────────────────────────────────────────────────────────────────────────────────]
457 // static
458 MaybeHandle<Object> Execution::Call(Isolate* isolate, Handle<Object> callable,
459 Handle<Object> receiver, int argc,
460 Handle<Object> argv[]) {
461 return Invoke(isolate, InvokeParams::SetUpForCall(isolate, callable, receiver,
462 argc, argv));
463 }
464
465 MaybeHandle<Object> Execution::CallBuiltin(Isolate* isolate,
466 Handle<JSFunction> builtin,
[───────────────────────────────────────────────────────────────────────────────────────STACK
是的,你可以这样做,就像任何其他C++代码一样。
当然,这段代码作为mksnapshot
的一部分运行,它所做的是创建一个";内置";可以处理将元素附加到JavaScript数组的代码对象。第2869行将把一个注释放入代码对象的注释部分(如果您使用--code-comments
标志运行(,第2870行将定义一个稍后用于条件跳转的标签。
因此,需要明确的是,当您将元素实际附加到数组时,这段代码不会运行。届时,由该代码生成的内置程序将运行,并且调试需要不同的技术(请参阅其他答案(。
编辑以解决评论中的问题:
如果我在第2870行输入
p kind
,我能得到kind
的值吗?如果我在这个函数中输入p ElementsKindToString
,我能得到函数ElementsKindToString
的地址吗?
是的,当然,这是纯C++。(还有,你为什么问?试试看!(
在Turbofan后端将此函数转换为机器代码并获得我上面发布的调试格式之前,我如何破解gdb。
在GDB中运行mksnapshot
并在所需行上设置断点,然后根据需要切换视图模式。(同样,这是GDB的常规用法;如果你需要GDB教程,请搜索一个,网上有很多。(
虽然您还没有直接要求,但我怀疑您真正想做的是一条接一条地浏览生成的内置指令,并查看负责生成它们的CSA来源。不幸的是,这是不可能的,因为内置程序及其生成器在不同的时间运行(甚至在不同的二进制文件中!(。