Xen 獲取call trace 的方法

          Posted on 2010-07-21 16:27 startpoint 閱讀(513) 評論(0)  編輯  收藏 所屬分類: 系統(tǒng)虛擬化
          我們知道在xen在crash的時候會出現(xiàn)一段call trace,往往我們能從這個call trace里面找到bug發(fā)生在哪里。但是對于那些沒有使xen crash掉的bug我們怎么辦呢?我找到一個方便的方法,利用xen現(xiàn)有的代碼——show_trace function。代碼如下:
           1 static void show_trace(struct cpu_user_regs *regs)
           2 {
           3     unsigned long *stack = ESP_BEFORE_EXCEPTION(regs), addr;
           4 
           5     printk("Xen call trace:\n   ");
           6 
           7     printk("[<%p>]", _p(regs->eip));
           8     print_symbol(" %s\n   ", regs->eip);
           9 
          10     while ( ((long)stack & (STACK_SIZE-BYTES_PER_LONG)) != 0 )
          11     {
          12         addr = *stack++;
          13         if ( is_kernel_text(addr) || is_kernel_inittext(addr) )
          14         {
          15             printk("[<%p>]", _p(addr));
          16             print_symbol(" %s\n   ", addr);
          17         }
          18     }
          19 
          20     printk("\n");
          21 }
          這里面大部分代碼都不需要修改的,可以被重用,只是如果獲取rsp(x86_64)的方法得變一下。原函數(shù)是又上層傳遞下來的,我們則需要從當(dāng)前寄存器里面讀取出來,那么如果將一個寄存器的值存到變量里面呢?用GCC inline assembly,代碼如下:
          1 unsigned long *stack;
          2 asm volatile ("movq %%rsp, %0""=r"(stack))
          ;
          ;
          我們用上面的方法就可以獲取rsp寄存器的值了,讀取的值被放在stack變量當(dāng)中。
          一切搞定,我們現(xiàn)在就可以用這個我們新創(chuàng)造出來的方法進行call trace的打印了。

          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 宜宾县| 沾益县| 浑源县| 巴南区| 额敏县| 思茅市| 巴东县| 哈尔滨市| 辛集市| 天柱县| 肃宁县| 靖远县| 江都市| 当阳市| 安乡县| 咸阳市| 通海县| 绥江县| 仁布县| 西乡县| 乐山市| 乐昌市| 漯河市| 武城县| 将乐县| 读书| 图木舒克市| 宣汉县| 周宁县| 霍林郭勒市| 闽侯县| 石景山区| 海原县| 神农架林区| 阿拉善盟| 格尔木市| 乐平市| 沁阳市| 吴堡县| 且末县| 兰州市|