如何在v8中逐行调试CodeStubAssembler(CSA)代码



我已经从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来源。不幸的是,这是不可能的,因为内置程序及其生成器在不同的时间运行(甚至在不同的二进制文件中!(。

相关内容

  • 没有找到相关文章

最新更新