【问题】
C#中,对于一行代码,加了断点,而且肯定会执行到的。
结果调试的时候,却无法调试到。
现象看起来是,该行代码,直接被忽略掉了。
比如,对于代码:
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行的:
if (generalCategoryList.Count > 0)
加了断点,但是结果竟然执行不到该行。
【解决过程】
1.这种现象:
加了断点,但是调试时却执行不到
之前其实就遇到过,不知道怎么解决的。
现在又遇到了。
2.经过一番调试发现,原来问题出在:
对于打了断点的代码之前,
某些变量
(此处的generalCategoryList)
没有正常的初始化
而导致之前的代码的地方,就已经出问题了
(此处的
generalCategoryList.Add(singleCategoryItem);
)
导致后续的代码,虽然加了断点,也是执行不到的。
但是问题还是很诡异,对于此处的
generalCategoryList
的确缺少了正常的初始化
(后来加上了正确的:
generalCategoryList = new List<categoryItem>();
)
所以,按理来说,执行了:
generalCategoryList.Add(singleCategoryItem);
应该会报错,或者出现异常才对
但是,实际上,调试时,执行该行代码,直接就返回了
返回到了窗体主界面,跳出了调试的过程
且没有任何错误的提示
这导致后续的代码,根本就被忽略掉了。
3.此处解决办法很简答,添加上对应的初始化代码:
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#中代码加了断点,但是调试时却无法执行到