在我的应用程序中,在vxWorks上部署了backtrace(在xrtc文件上生成)后生成:
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此值作为SEM_ID传递给semTake当调用semTake时我获得了S_objLib_OBJ_ID_ERROR。
PS:我没有转储文件
是否可能在堆栈上错误地传递函数参数。
是的,绝对有可能。在使用在MIPS32处理器上运行的旧版VxWorks时,我已经看到了用于任务跟踪的这种行为。 MIPS calling convetions不需要在堆栈上放置函数参数,它们通过寄存器传递,可能根本不会出现在堆栈中。不确定是不是原因,但函数调用参数对我来说从来都不准确。