(当有进一步情况时,该贴会进行更新。)
参考网址:
http://www.360doc.com/content/12/0524/13/8053702_213354653.shtml
一直以来都遇到一些问题很难调试,即使用vs2010自己去调试也有些问题没法定位,所以不得不去看下windbg如何使用。
之前都有尝试去用,但实在是不会用,也就放下多次了。
现在又在调试一个程序,还是cpu占用高的问题,就想找到究竟是哪个线程导致的。
除了参考以上列的网址,另外还看了windbg的帮助文档。
我现在在调试的程序是一个控件,其由vs2010的C#调用。
windbg先设置了符号路径和源代码的路径,也不知道是否有用,反正我在后面的调试过程中也没有看到代码,呵呵,不过以后的调试的多了,也可能会有改变吧。
我不知道如何去load sos.dll文件,没地方输入,所以也没有设置这一项。
首先启动要调试的程序,在windbg上把该进程附加上来,然后在命令输入位置输入:
g
然后回车(或者是不输入直接按F5也是一样的),程序开始正常运行(此时命令输入位置不可输入任何内容,显示为“BUSY”状态),结果没几秒钟程序就似乎 是抛了个异常出来,命令输入的位置变得可用,于是参考上面的网址赶紧load sos.dll(结果也不知道有没有用)。看了一下打印似乎也没啥有意思的信息,于是继续g运行程序。
cpu占用过高的问题定位。
由于不知道如何使命令输入变得可用,只好等待。结果没过多久,果然又抛了个异常出来,又变得可用了。
首先列出所有线程:
~.
注意后面的那个英文句号,也是要输入的,然后就打印出了所有运行的线程及相关信息。我不会看,只注意了有个线程号。
然后输入命令:
!runaway
它列出了所有线程的运行时间,然后调出 processes and threads 和 calls (stack) 窗口, 在 processes and threads 窗口中选中占用时间长的那个线程,在calls (stack) 窗口中可以看到它的调用堆栈,根据调用堆栈可以确定是哪个线程(其中有线程调用的函数名)。再去代码里仔细检查该线程即可。
windbg.exe -I
注意参数I为大写i