最新消息:20210816 当前crifan.com域名已被污染,为防止失联,请关注(页面右下角的)公众号

【已搞懂】C#中代码加了断点,但是调试时却无法执行到

C# crifan 8934浏览 0评论

【问题】

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

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

网友最新评论 (1)

  1. 楼主 ,当你的页面添加了缓存后,它就不可以调试了
    Naylor10年前 (2015-06-29)回复
85 queries in 0.202 seconds, using 22.15MB memory