Возможно ли, чтобы аргумент для фрейма передавался в качестве аргумента другому фрейму в трассировке, даже если типы данных отличаются - PullRequest
0 голосов
/ 29 марта 2019

В моем приложении, которое развернуто на 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 */
);

Возможно ли, что аргумент типа uchar ** msg из кадра 3 передается в кадр 5 в качестве аргумента, даже если типы данных различаются.

Я новичок в vxWorks среда.Возможно ли, что аргументы функции передаются неправильно в стеке.

FFFFFF00 (H) -> 4 294 967 040, это значение передается как SEM_ID в semTake. Я получил S_objLib_OBJ_ID_ERROR при вызове semTake.

PS: я неесть файл дампа

1 Ответ

0 голосов
/ 16 апреля 2019

Возможно ли, что аргументы функции неправильно передаются в стеке.

Да, безусловно, возможно. Я видел такое поведение для трассировки задач при работе со старой версией VxWorks, работающей на процессорах MIPS32. MIPS вызов конвенций не требует помещения аргументов функции в стек, они передаются через регистры и могут вообще не появляться в стеке. Не уверен, что это было причиной, но параметры вызова функции никогда не были точными для трассировки.

...