在我的应用程序中,该应用程序在 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:我没有转储文件
答案 0 :(得分:0)
函数参数是否有可能在堆栈上错误地传递。
是的,绝对有可能。使用在MIPS32处理器上运行的旧版本VxWorks时,我已经看到了这种任务跟踪行为。 MIPS calling convetions不需要将函数参数放在堆栈上,它们通过寄存器传递,并且可能根本不会出现在堆栈上。不知道是不是原因,但是函数调用参数对我来说永远都不准确。