使用gdb调试user程序 之 某个线程的调用栈

1.首先使用ps -aux查看我们需要debug的程序的进程id

image

 2.使用 top -p 1167,然后按下"c",再按下“H”。或者直接运行top -p 1167 -cH

image

3.查看这个线程的状态

首先切换到目录 /proc/<线程id>

cd /proc/1377

通过cat status知道线程在sleeping状态

image

通过cat stack可以看到此时的内核的调用栈,原来是在wait。

不过只能看到内核态的调用栈,不能看到user态的调用栈,还是不能定位 我user的代码卡在哪里了。

image

 4.怎么查看user态的调用栈呢,使用gdb

attach 进程:gdb -p 1167

查看内部线程id: info thread

image

 

5.切换到内部线程id是6的那个线程,并查看backtrace

至此,用户态的调用栈也就知道了,下面再根据地址在unstrip的对应程序中找到对应的函数名

image

 

 6.使用addr2line查看在文件中的哪一行

image

 7.至此 可以看到 这个线程 卡在什么地方了。

posted @ 2025-12-18 17:57  midhillzhou  阅读(5)  评论(0)    收藏  举报