1. 按地址查看符號表
y.list
2. Linux顯示用戶進程調用棧
一般情況下我們加載dump或者在線attach時只加載了Linux Kernel的符號表(vmlinux),此時只能看到內核空間的調用棧關系,如下圖:
如果想顯示用戶空間的調用棧關系,可以這么做:
(1)點開菜單Linux->Display Processes,在任務列表里面找到當前的任務,點擊右鍵選擇Display Detailed,打開如下窗口:
(2)在code file選項卡中可以看到:libuClibc的開始地址為0xb6dde000,其它庫文件的地址也都一起列了出來;
(3)加載dnsmasq主進程符號表 與 libuClibc 符號表
data.load.elf E:\RD\Trace32\0511\dnsmasq.elf /nocode /noclear (dnsmasq.elf 文件編譯時已包含偏移地址0x8000,此時不需要再指定偏移)
data.load.elf E:\RD\Trace32\0511\libuClibc-0.9.33.2.so 0xb6dde000 /nocode /noclear (so文件為使用uClibc-0.9.33.2進行交叉編譯后得到的elf文件)
(4)一般情況下加載上面兩項后即可以看到用戶進程的調用棧關系,如果有的地址還是無法解析,可以進一步加載對應地址的庫文件的符號表。
3. Linux切換用戶進程
一般情況下我們加載dump或者在線attach后只能看到當前用戶進程的調用棧信息,如果想看其他任務的調用棧關系,可以這么做:
(1)點開菜單Linux->Display Processes,在任務列表里面找到當前的任務,點擊右鍵選擇Display Task Struct,打開如下窗口:
(2)讀取該進程的一級頁表基地址即PGD,具體路徑為(task_struct) ->mm->pgd,得到PGD的虛擬地址;
(3)根據內核空間虛擬地址和物理地址的映射關系,將PGD轉換為物理地址,例如映射關系為(0xc0000000<-->0x22300000),那么該PGD的物理地址為0x243e0000;
(4) 將轉換后的PGD 物理地址寫入TTBR0的基地址段([31:10]):
(5) 回到第一步的任務列表,右鍵點擊要切換的目的任務,選擇Switch Context, 此時就能看到該任務的調用棧關系:
(6) 如果還要進一步查看用戶空間的調用棧關系,可以繼續按照 Linux顯示用戶進程調用棧 的方法進行實現。