即使数据类型不同,frame的参数也可能作为参数传递给回溯中的另一帧

时间:2019-03-29 12:57:22

标签: c++ vxworks

在我的应用程序中,该应用程序在 backtrace (在xrtc文件中生成)之后被部署在vxWorks上:

 d475c (Frame 1) process_host_invoke+274: d3bac (ffffff00, 3e8)
 d3cac (Frame 2) stop_feature_monitor+904: receive_invoke_reply ()
 d0318 (Frame 3) receive_invoke_reply+7c : wait_reply_msg (3e8, 7950818, ffffff00)
 cc6a4 (Frame 4) wait_reply_msg+98 : semTake (ffffff00, 3e8)
859690 (Frame 5) semTake        +28 : vxWorks_semTake (ffffff00, 3e8)

以下是上面调用的方法的原型:

void process_host_invoke(X *param);
int wait_reply_msg(uchar **msg,int* size,int wait_tick );

STATUS semTake(
SEM_ID semId,  /* semaphore ID to take */
int    timeout /* timeout in ticks */
);

即使数据类型不同,第3帧的uchar ** msg类型的参数也可能作为参数传递到第5帧。

我是 vxWorks 环境的新手。函数参数是否有可能在堆栈上错误地传递。

FFFFFF00(H)->4,294,967,040‬这个值在semTake中作为SEM_ID传递 调用semTake时出现 S_objLib_OBJ_ID_ERROR

PS:我没有转储文件

1 个答案:

答案 0 :(得分:0)

  

函数参数是否有可能在堆栈上错误地传递。

是的,绝对有可能。使用在MIPS32处理器上运行的旧版本VxWorks时,我已经看到了这种任务跟踪行为。 MIPS calling convetions不需要将函数参数放在堆栈上,它们通过寄存器传递,并且可能根本不会出现在堆栈上。不知道是不是原因,但是函数调用参数对我来说永远都不准确。