当VS调试程序时,如何知道卡在了哪里

时间:2023-02-20 17:43:56
在调试程序的时候,遇到一个这样的问题,

......
doc.Add(table);
......

当程序执行到doc.Add方法的时候,就卡住了,也不抛异常。 其实一开始我也不知道这里卡住,只是程序一跑,就无反应了,
我是一步一步调试才知道是卡在了这里。

有什么方法能够准确知道VS中,程序是运行到哪一句代码的时候,然后就不往下走了么?

18 个解决方案

#1


doc.add是啥,跟进去

#2


可以让调试器停住,然后在调试堆栈中看到它当前调用的是什么。

当然,如果你有完备的单元测试和日志,那么发现起来或许容易一些。

#3


用日志记录一下噻

#4


f11跟进去?

#5


引用 1 楼 bdmh 的回复:
doc.add是啥,跟进去


doc.Add 是ItextSharp,是第三方dll提供的一个方法,再往下走就是Metadata了。我的意思是,我完全不知道程序到这里就卡住了,我是一步一步的代码调试到这里才发现的。有没有什么办法能够定位的哪个方法执行的时候非常耗时?否则如果代码很多的话,一步一步调试那就太费劲了。

#6


引用 2 楼 caozhy 的回复:
可以让调试器停住,然后在调试堆栈中看到它当前调用的是什么。

当然,如果你有完备的单元测试和日志,那么发现起来或许容易一些。


让调试器停住看堆栈貌似就是这个?这个具体怎么操作,有没有什么链接可以给我,谢谢。

#7


一看就是操作word的。。不抛异常估计是出现死循环或者死锁了。。仔细检查代码。看是不是用了多线程或者死循环

#8


既然知道卡在哪,在那设置个断点,然后调试查看,具体问题不就容易找出了?

#9


引用 7 楼 qzyf1992 的回复:
一看就是操作word的。。不抛异常估计是出现死循环或者死锁了。。仔细检查代码。看是不是用了多线程或者死循环


这个是操作PDF的,生成PDF的。doc.Add方法最底层的方法,就是在这里就卡住不动了。

#10


当VS调试程序时,如何知道卡在了哪里

#11


当VS调试程序时,如何知道卡在了哪里

#12


如果你能遵循规范,不要把大段的代码都写到一个方法里,而是将相似的内容进行封装,每个函数里代码不要过多
这样查找起来会快很多

至于为什么会卡住,只能自己去找原因了.除非你有dll的源码并且附加进工程,否则dll里到底怎么了,谁知道

#13


引用 9 楼 sundacheng1989 的回复:
Quote: 引用 7 楼 qzyf1992 的回复:

一看就是操作word的。。不抛异常估计是出现死循环或者死锁了。。仔细检查代码。看是不是用了多线程或者死循环


这个是操作PDF的,生成PDF的。doc.Add方法最底层的方法,就是在这里就卡住不动了。

把你的dll拿去反编译看看里面的逻辑 还有把断电去掉 看看 抛不抛异常 。如果不抛异常而且 很长时间没反应 那估计就是 出现死循环或者死锁或者无线递归的情况。。不然的话应该会抛异常的。。而且可能这个Add方法需要时间过长导致断电没反应这都很正常

#14


还有,如果多个线程共用一个函数,加断点有时候会卡住
要加断点,最好是把要测试的函数放到主线程里运行,然后再断点测试

#15


引用 14 楼 Z65443344 的回复:
还有,如果多个线程共用一个函数,加断点有时候会卡住
要加断点,最好是把要测试的函数放到主线程里运行,然后再断点测试


嗯。好的,谢谢。

其实最终总结一下,就是VS里边没有任何小工具能查看当前程序运行到哪里了,这样理解对吧?

#16


如果一个对象调试进不去,通常意味着该对象的创建出了异常,检测下该对象new构建函数是否能够创建

#17


当VS调试程序时,如何知道卡在了哪里

#18


用 ETW,
下载 PERFVIEW

#1


doc.add是啥,跟进去

#2


可以让调试器停住,然后在调试堆栈中看到它当前调用的是什么。

当然,如果你有完备的单元测试和日志,那么发现起来或许容易一些。

#3


用日志记录一下噻

#4


f11跟进去?

#5


引用 1 楼 bdmh 的回复:
doc.add是啥,跟进去


doc.Add 是ItextSharp,是第三方dll提供的一个方法,再往下走就是Metadata了。我的意思是,我完全不知道程序到这里就卡住了,我是一步一步的代码调试到这里才发现的。有没有什么办法能够定位的哪个方法执行的时候非常耗时?否则如果代码很多的话,一步一步调试那就太费劲了。

#6


引用 2 楼 caozhy 的回复:
可以让调试器停住,然后在调试堆栈中看到它当前调用的是什么。

当然,如果你有完备的单元测试和日志,那么发现起来或许容易一些。


让调试器停住看堆栈貌似就是这个?这个具体怎么操作,有没有什么链接可以给我,谢谢。

#7


一看就是操作word的。。不抛异常估计是出现死循环或者死锁了。。仔细检查代码。看是不是用了多线程或者死循环

#8


既然知道卡在哪,在那设置个断点,然后调试查看,具体问题不就容易找出了?

#9


引用 7 楼 qzyf1992 的回复:
一看就是操作word的。。不抛异常估计是出现死循环或者死锁了。。仔细检查代码。看是不是用了多线程或者死循环


这个是操作PDF的,生成PDF的。doc.Add方法最底层的方法,就是在这里就卡住不动了。

#10


当VS调试程序时,如何知道卡在了哪里

#11


当VS调试程序时,如何知道卡在了哪里

#12


如果你能遵循规范,不要把大段的代码都写到一个方法里,而是将相似的内容进行封装,每个函数里代码不要过多
这样查找起来会快很多

至于为什么会卡住,只能自己去找原因了.除非你有dll的源码并且附加进工程,否则dll里到底怎么了,谁知道

#13


引用 9 楼 sundacheng1989 的回复:
Quote: 引用 7 楼 qzyf1992 的回复:

一看就是操作word的。。不抛异常估计是出现死循环或者死锁了。。仔细检查代码。看是不是用了多线程或者死循环


这个是操作PDF的,生成PDF的。doc.Add方法最底层的方法,就是在这里就卡住不动了。

把你的dll拿去反编译看看里面的逻辑 还有把断电去掉 看看 抛不抛异常 。如果不抛异常而且 很长时间没反应 那估计就是 出现死循环或者死锁或者无线递归的情况。。不然的话应该会抛异常的。。而且可能这个Add方法需要时间过长导致断电没反应这都很正常

#14


还有,如果多个线程共用一个函数,加断点有时候会卡住
要加断点,最好是把要测试的函数放到主线程里运行,然后再断点测试

#15


引用 14 楼 Z65443344 的回复:
还有,如果多个线程共用一个函数,加断点有时候会卡住
要加断点,最好是把要测试的函数放到主线程里运行,然后再断点测试


嗯。好的,谢谢。

其实最终总结一下,就是VS里边没有任何小工具能查看当前程序运行到哪里了,这样理解对吧?

#16


如果一个对象调试进不去,通常意味着该对象的创建出了异常,检测下该对象new构建函数是否能够创建

#17


当VS调试程序时,如何知道卡在了哪里

#18


用 ETW,
下载 PERFVIEW