【问题】
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#中代码加了断点,但是调试时却无法执行到