You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Linux x64下SBDebugger成员函数this参数调用约定疑问

Linux x64平台调用LLDB C++ API的调用约定问题

我需要从非C语言编写的应用中调用Linux x64平台的LLDB函数(该问题可扩展至任意C API调用场景),因此必须明确对应的调用约定及参数传递规则。

我尝试调用的目标函数是SBDebugger::GetCommandInterpreter,其C++定义如下:

lldb::SBCommandInterpreter GetCommandInterpreter();

最初我认为,作为成员方法,它会将SBDebugger指针作为this参数传入RDI寄存器,但按此方式调用时直接触发了段错误。

查看该函数的反汇编代码:

push   %r13 
push   %r12 
mov    %rsi,%r12 
push   %rbp 
push   %rbx 
mov    %rdi,%rbx 

可以看到函数同时读取了RDI和RSI寄存器,但按函数定义它只需要this这一个参数。结合SBDebugger对象大小为16字节(内部包含一个shared_ptr)的情况,我推测该函数期望this按值传递而非引用——根据System V ABI规则,16字节的参数会拆分到RDI和RSI两个寄存器中,这和反汇编的行为吻合。

但这个推测存在两处不合理的地方:

  • 如果this按值传递,方法执行产生的副作用无法同步到调用方的原对象上;
  • System V ABI明确规定:若C++对象拥有非平凡拷贝构造函数或析构函数,则通过隐式引用传递,而SBDebugger确实定义了自定义的析构函数和拷贝构造函数:
SBDebugger();

SBDebugger(const lldb::SBDebugger &rhs);

SBDebugger(const lldb::DebuggerSP &debugger_sp);

~SBDebugger();

我尝试按值传递SBDebugger对象时,调用本身看似成功,但后续使用返回的SBCommandInterpreter时触发了段错误,推测方法返回的是无效数据。

我尚未理清该方法调用的核心逻辑,请问:应该向哪些寄存器传递什么值?背后的原因是什么?


内容的提问来源于stack exchange,提问作者Kevin Gosse

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 19:51:21