2014-06-18 21 views
0

我正嘗試將一個嵌入式操作系統移植到一個新的平臺上,並且我正面臨文件系統組件的一些問題。 我在代碼中走到最後定位問題: 有關我的情況下,函數調用爲什麼va_arg返回錯誤的數據?

// int64_t vnid = 1; 
    // int32_t vid = 0; 
    ... 
    vnode = queue_lookup (& vnode_manager . vnode_list, 
       vnode_id_inspector, vnid, vid); 

這裏是queue_lookup聲明:

void * queue_lookup (queue_t * queue, queue_inspector_t inspector, ...) 
    { 
     bool result; 
     va_list list, list_copy; 
     queue_link_t * item = NULL; 

     va_start (list, inspector); 

     if (queue -> status != 0) 
     { 
     for (item = queue -> head; item != NULL; item = item -> next) 
     { 
      result = false; 

      va_copy (list_copy, list); 
      result = inspector (item, list_copy); 
      va_end (list_copy); 

      if (result) break; 
     } 
     } 

     va_end (list); 
     return item; 
    } 

最後,這裏是vnode_id_inspector聲明:

bool vnode_id_inspector (void * node, va_list list) 
    { 
     vnode_t vnode = node; 
     int64_t vnid = va_arg (list, int64_t); 
     int32_t vid = va_arg (list, int32_t); 

     watch (bool) 
     { 
     ensure (vnode != NULL, false); 
     return vnode -> id == vnid && vnode -> volume -> id == vid; 
     } 
    } 

現在的問題是當我用vnid = 1和vid = 0調用queue_lookup時,我在vnode_id_inspector中得到了vnid = 1和vid = 1145248!

如何以儘可能最小的代碼更改解決此問題?

問候,

編輯:添加一些調試信息

(gdb) p vnode_manager . vnode_list 
    $44 = {lock = 1, head = 0x167770, tail = 0x167770, status = 1} 
    (gdb) p vnode_manager . vnode_list ->head 
    $45 = (queue_link_t *) 0x167770 
    (gdb) p *(vnode_t)vnode_manager . vnode_list ->head 
    $46 = {link = {next = 0x0}, id = 1, volume = 0x166370, destroy = false, 
     usage_counter = 1, data = 0x166430} 
    (gdb) p *(volume_t)((vnode_t)vnode_manager . vnode_list ->head)->volume 
    $47 = {link = {next = 0x0}, id = 0, root_vnid = 1, lock = 0, host_volume = 0x0, 
     host_vnid = -1, cmd = 0x13a768 <rootfs_cmd>, data = 0x1663d0} 
+0

vid和vnid的類型是否正確? – nos

+0

是的類型是正確的! –

+0

'int64_t'!='uint64_t',是嗎?這是什麼:'&vnode_manager。 vnode_list,'? – this

回答

0

我解決了這個問題,有一個在棧對齊的問題。我通過在cpu_context_switch.s中進行一些調整來修復它,以將堆棧對齊到8字節而不是4字節

相關問題