【问题】
C#中,对于一行代码,加了断点,而且肯定会执行到的。
结果调试的时候,却无法调试到。
现象看起来是,该行代码,直接被忽略掉了。
比如,对于代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | HtmlAgilityPack.HtmlDocument htmlDoc = crl.htmlToHtmlDoc(respHtml); HtmlNode categorySelectNode = htmlDoc.DocumentNode.SelectSingleNode( "//span[@id='nav-search-in' and @class='nav-sprite']/select[@name='url' and @id='searchDropdownBox' and @class='searchSelect']" ); if (categorySelectNode != null ) { HtmlNodeCollection optionNodeList = categorySelectNode.SelectNodes( ".//option[@value]" ); //omit first one: //<option value="search-alias=aps" selected="selected">All Departments</option> optionNodeList.Remove(0); foreach (HtmlNode singleOptionNode in optionNodeList) { ...... //store info categoryItem singleCategoryItem = new categoryItem(); //singleCategoryItem.Name = generalCategory; //singleCategoryItem.Url = singleCategoryUrl; singleCategoryItem.name = generalCategory; singleCategoryItem.url = singleCategoryUrl; //add to list generalCategoryList.Add(singleCategoryItem); } if (generalCategoryList.Count > 0) { //init search category cmbSubCategory.DataSource = generalCategoryList; cmbSubCategory.DisplayMember = "name" ; cmbSubCategory.ValueMember = "url" ; } |
然后给25行的:
1 | if (generalCategoryList.Count > 0) |
加了断点,但是结果竟然执行不到该行。
【解决过程】
1.这种现象:
加了断点,但是调试时却执行不到
之前其实就遇到过,不知道怎么解决的。
现在又遇到了。
2.经过一番调试发现,原来问题出在:
对于打了断点的代码之前,
某些变量
(此处的generalCategoryList)
没有正常的初始化
而导致之前的代码的地方,就已经出问题了
(此处的
generalCategoryList.Add(singleCategoryItem);
)
导致后续的代码,虽然加了断点,也是执行不到的。
但是问题还是很诡异,对于此处的
generalCategoryList
的确缺少了正常的初始化
(后来加上了正确的:
1 | generalCategoryList = new List<categoryItem>(); |
)
所以,按理来说,执行了:
generalCategoryList.Add(singleCategoryItem);
应该会报错,或者出现异常才对
但是,实际上,调试时,执行该行代码,直接就返回了
返回到了窗体主界面,跳出了调试的过程
且没有任何错误的提示
这导致后续的代码,根本就被忽略掉了。
3.此处解决办法很简答,添加上对应的初始化代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | generalCategoryList = new List<categoryItem>(); HtmlAgilityPack.HtmlDocument htmlDoc = crl.htmlToHtmlDoc(respHtml); HtmlNode categorySelectNode = htmlDoc.DocumentNode.SelectSingleNode( "//span[@id='nav-search-in' and @class='nav-sprite']/select[@name='url' and @id='searchDropdownBox' and @class='searchSelect']" ); if (categorySelectNode != null ) { HtmlNodeCollection optionNodeList = categorySelectNode.SelectNodes( ".//option[@value]" ); //omit first one: //<option value="search-alias=aps" selected="selected">All Departments</option> optionNodeList.Remove(0); foreach (HtmlNode singleOptionNode in optionNodeList) { ...... //store info categoryItem singleCategoryItem = new categoryItem(); //singleCategoryItem.Name = generalCategory; //singleCategoryItem.Url = singleCategoryUrl; singleCategoryItem.name = generalCategory; singleCategoryItem.url = singleCategoryUrl; //add to list generalCategoryList.Add(singleCategoryItem); } if (generalCategoryList.Count > 0) { //init search category cmbSubCategory.DataSource = generalCategoryList; cmbSubCategory.DisplayMember = "name" ; cmbSubCategory.ValueMember = "url" ; } |
【总结】
当遇到:
给某行代码加了断点,但是调试时却没有执行到
则去:
找到断点之前的代码,肯定存在了某种问题
比如此处的:
断点处,之前的变量,generalCategoryList,没有初始化,但是却直接拿来使用:
generalCategoryList.Add(singleCategoryItem);
导致代码就从调试模式返回了程序窗体界面
导致后续代码,包括打了断点的代码,没有执行到
教训:
还是写代码的时候,要小心,未初始化的变量
疑问:
VS2010中,在调试的时候:
为何执行没有初始化的generalCategoryList的代码:
generalCategoryList.Add(singleCategoryItem);
却没有报错?而只是程序直接跳出debug模式,而返回程序主界面??
转载请注明:在路上 » 【已搞懂】C#中代码加了断点,但是调试时却无法执行到