找到原因了。你的命令watchmtapi.mt5.MT5API OrderSend{params, returnObj}-x3实际上监控了OrderSend(...) OrderSend(..., D) OrderSend(..., DD) OrderSend(..., DDJ) ... 共9个重载Arthas 已经明确告诉你Affect(class count: 1 , method count: 9)而 MT5API 这种 SDK 的写法通常是publicOrderOrderSend(a,b,c,d){returnOrderSend(a,b,c,d,0);}publicOrderOrderSend(a,b,c,d,e){returnOrderSend(a,b,c,d,e,0);}publicOrderOrderSend(a,b,c,d,e,f){returnnativeOrderSend(...);}也就是短参数版本 ↓ 长参数版本 ↓ 最长参数版本 ↓ Native例如OrderSend(symbol,volume,price,type)实际执行路径可能是OrderSend(4个参数) ↓ OrderSend(5个参数) ↓ OrderSend(10个参数)因此 Arthas 会打印第1次返回 第2次返回 第3次返回看起来像调用了3次。实际上是同一次业务调用 经过了3个重载方法验证方法执行trace mtapi.mt5.MT5API OrderSend下一次下单时大概率会看到OrderSend(...) ---OrderSend(...) ---OrderSend(...) ---native你可以直接只监控最终那个最长的方法。例如最后一个签名OrderSend( String, double, double, OrderType, double, double, long, String, long, FillPolicy, double )用watchmtapi.mt5.MT5API OrderSend\{params, returnObj}\params.length11或者trace mtapi.mt5.MT5API OrderSend\#cost0 params.length11这样只会命中最终实现。还有一种更直观的验证watchmtapi.mt5.MT5API OrderSend\{method.name, params.length, returnObj}\-x3你会看到类似[ OrderSend, 4, ... ] [ OrderSend, 7, ... ] [ OrderSend, 11, ... ]如果是这样就100%说明是重载链调用不是业务代码真的调用了3次下单。从你贴的 MT5API 结构来看我估计就是这种情况尤其这种 SDK 非常喜欢用多个重载最终汇聚到一个 native 实现。
watch mtapi.mt5.MT5API OrderSend ‘{params, returnObj}‘ -x 3 会显示3个返回
找到原因了。你的命令watchmtapi.mt5.MT5API OrderSend{params, returnObj}-x3实际上监控了OrderSend(...) OrderSend(..., D) OrderSend(..., DD) OrderSend(..., DDJ) ... 共9个重载Arthas 已经明确告诉你Affect(class count: 1 , method count: 9)而 MT5API 这种 SDK 的写法通常是publicOrderOrderSend(a,b,c,d){returnOrderSend(a,b,c,d,0);}publicOrderOrderSend(a,b,c,d,e){returnOrderSend(a,b,c,d,e,0);}publicOrderOrderSend(a,b,c,d,e,f){returnnativeOrderSend(...);}也就是短参数版本 ↓ 长参数版本 ↓ 最长参数版本 ↓ Native例如OrderSend(symbol,volume,price,type)实际执行路径可能是OrderSend(4个参数) ↓ OrderSend(5个参数) ↓ OrderSend(10个参数)因此 Arthas 会打印第1次返回 第2次返回 第3次返回看起来像调用了3次。实际上是同一次业务调用 经过了3个重载方法验证方法执行trace mtapi.mt5.MT5API OrderSend下一次下单时大概率会看到OrderSend(...) ---OrderSend(...) ---OrderSend(...) ---native你可以直接只监控最终那个最长的方法。例如最后一个签名OrderSend( String, double, double, OrderType, double, double, long, String, long, FillPolicy, double )用watchmtapi.mt5.MT5API OrderSend\{params, returnObj}\params.length11或者trace mtapi.mt5.MT5API OrderSend\#cost0 params.length11这样只会命中最终实现。还有一种更直观的验证watchmtapi.mt5.MT5API OrderSend\{method.name, params.length, returnObj}\-x3你会看到类似[ OrderSend, 4, ... ] [ OrderSend, 7, ... ] [ OrderSend, 11, ... ]如果是这样就100%说明是重载链调用不是业务代码真的调用了3次下单。从你贴的 MT5API 结构来看我估计就是这种情况尤其这种 SDK 非常喜欢用多个重载最终汇聚到一个 native 实现。