青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

C++ Programmer's Cookbook

{C++ 基礎} {C++ 高級} {C#界面,C++核心算法} {設計模式} {C#基礎}

調試breakpoint高級

breakpoint的右鍵菜單:
o_tiaoshi2.jpg

Tracepoints

When you have a "mystery" bug to solve, tracepoints are a vital part of your debugging arsenal. Single stepping and looking through code can be S-L-O-O-O-O-W and if you don't even know what you're looking for, it can consume hours and hours of effort. Tracepoints really speed things up. They're like breakpoints that don't break. In a way, they go back to the old "printf debugging" -- but you don't need to make code changes and recompile to change them.

To set a tracepoint, first set a breakpoint, then right-click on the red dot that appears in the margin and choose When Hit:

In the dialog that appears, click the Print A Message box and edit the starter message you are given. You can include any expression in braces and it will be evaluated when control reaches the tracepoint:

Leave the Continue Execution box checked so that you don't break. Tracepoints are identified by red diamonds instead of red dots:

The output from the tracepoints appears in the output window of your debug session:

You can set up something suspicious, let it run, then pore through the tracepoint output and see what you learn. It's a huge timesaver when you're tackling a "we don't even know where to start" bug. Plus, if the issue is related to threading or async issues in any way (and you know me, I keep preaching we will all be facing async issues eventually) then you don't have to worry that pausing execution suppresses the collisions. I recently helped a client solve a big hairy this-stuff-fails-for-our-biggest-customer-only bug using tracepoints... and a few other tricks I will cover in upcoming posts.

Conditional breakpoints

Conditional breakpoints were another really important tool in solving a recent "only happens at the big installations" bug in a big and complicated C++ application. We wanted to debug the code with as few rebuilds as possible and we really didn't know how parts of it worked at all. Tracepoints helped us to figure out a lot of it in a short time. We didn't have a decent repro case though, so here's what we did:

  • created a script to add an audit table and some triggers that write to it
  • created a script to remove those triggers and the table
  • created a batch file to run a server in verbose mode, and redirect the output to a text file (remembering DOS commands sure can be helpful...   myapp.exe -verbose >logfile.txt was the magic phrase.)
  • wrote some instructions for the support guy to grab a backup of the database, run the first script, run the batch file, let it run all night, then in the morning grab another backup of the database, run the second script, and stop the batch file.

Now we ran some queries on the morning version of the database to confirm that at least one X was missing a Y that should have been calculated overnight. We even had the Xid. Thanks to the tracepoint work of the previous day we knew where to be suspicious. A little digging in the trigger output told us whether the problem was "didn't get added" or "got added, but then got deleted". The last step was conditional breakpoints. These let us say "only stop here when you're processing the X with this Xid."

This really saves time when you just need to drill into what's happening in the case that is going wrong. You get to it by right clicking the red dot or diamond and choosing Condition.


One more breakpoint tip - hit count

Conditional breakpoints are cool when you know the value of one variable that is associated with trouble: this only blows up when Xid is 1234. They can also be used to reduce the boredom of single stepping. Say you've got some loop that goes around a few hundred times building up some string or array or something. You don't want to keep going round and round and round... it would be nice to jump ahead to halfway through, for example, and see how things are looking. Now if this is a for loop with a handy named variable, say

 

for (int i = 0; i<1000; i++)

 

Then you can use a conditional breakpoint and say "stop when i is 200". Or you could be clever and stop when i % 200 is 0 -- so that's every 200 times. But what if there's no i? What if you're going through a file or a recordset/dataset/resultset and you're going until the end? You don't want to add some fake variable that gets incremented each time through the loop, just so you can set a breakpoint that breaks on certain values of that variable. Instead you want to use the hit count property of the breakpoint. Just right click the red dot and choose Hit Count. There you can set the breakpoint to break whenever it's hit, just the 10th time it's hit, every tenth time (10, 20, 30 etc) or every time after the 10th time Or, of course, whatever number you want instead of 10:

Don't debug the slow way when there are tools to make you so much faster!

Filter   下次再介紹:

o_tiaoshi.jpg


注意:c#的也可以用的啊....



來自:http://www.gregcons.com/KateBlog/CategoryView.aspx?category=C%2B%2B

posted on 2006-08-16 14:47 夢在天涯 閱讀(3050) 評論(0)  編輯 收藏 引用 所屬分類: CPlusPlusC#/.NETVS2005/2008

公告

EMail:itech001#126.com

導航

統計

  • 隨筆 - 461
  • 文章 - 4
  • 評論 - 746
  • 引用 - 0

常用鏈接

隨筆分類

隨筆檔案

收藏夾

Blogs

c#(csharp)

C++(cpp)

Enlish

Forums(bbs)

My self

Often go

Useful Webs

Xml/Uml/html

搜索

  •  

積分與排名

  • 積分 - 1811735
  • 排名 - 5

最新評論

閱讀排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
      <noscript id="pjuwb"></noscript>
            <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
              <dd id="pjuwb"></dd>
              <abbr id="pjuwb"></abbr>
              免费成人av在线看| 一区二区三区.www| 久久综合色影院| 亚洲成人原创| 亚洲国产日韩在线| 欧美视频一区二区三区| 亚洲一二区在线| 亚洲一区在线观看免费观看电影高清| 国产精品成人观看视频免费| 久久精品官网| 麻豆精品网站| 亚洲欧美日韩中文视频| 久久国产精品电影| 亚洲美女区一区| 亚洲欧美国产精品va在线观看| 国内精品视频一区| 最新日韩在线| 国产亚洲亚洲| 亚洲人精品午夜| 国产热re99久久6国产精品| 欧美成人免费全部观看天天性色| 欧美精品乱码久久久久久按摩| 亚洲欧美激情四射在线日| 久久福利资源站| 在线亚洲精品福利网址导航| 久久精品国产久精国产思思| 一本久久综合| 久久精品亚洲精品| 午夜日韩电影| 欧美激情一区在线观看| 久久精品一区| 欧美日韩久久| 欧美91视频| 国产麻豆综合| 一本色道久久综合亚洲精品高清| 精品成人一区| 亚洲欧美日本国产有色| 日韩一级片网址| 久久久久久久久久久成人| 亚洲一区二区视频| 欧美福利视频一区| 久久综合伊人77777| 国产精品美女久久久久久2018| 亚洲国产aⅴ天堂久久| 国产最新精品精品你懂的| 亚洲无线视频| 亚洲一区高清| 欧美日韩精品一区二区三区| 亚洲福利国产精品| 亚洲国产成人在线播放| 欧美淫片网站| 久久久精品动漫| 国产免费观看久久| 亚洲图片在线| 亚洲综合第一页| 欧美日韩一区二区视频在线| 亚洲国产色一区| 亚洲精选视频在线| 欧美成人首页| 亚洲激情视频在线| 99在线热播精品免费| 欧美激情一区二区三区成人| 最新国产成人在线观看| 99精品热视频| 欧美日韩一区二区三| 99亚洲视频| 亚洲永久免费精品| 国产精品网曝门| 亚洲伊人观看| 久久婷婷亚洲| 亚洲国产精品一区二区尤物区| 久久天天躁狠狠躁夜夜av| 欧美成人精品1314www| 亚洲国产精品成人精品| 欧美激情一区二区三区蜜桃视频| 亚洲人精品午夜| 亚洲欧美视频| 激情五月综合色婷婷一区二区| 久久综合国产精品| 亚洲精品久久久一区二区三区| 亚洲深夜福利视频| 国产欧美日本一区二区三区| 久久精品色图| 91久久国产综合久久91精品网站| 正在播放亚洲一区| 国产一区二区三区四区hd| 久久久久久久综合狠狠综合| 最新国产拍偷乱拍精品| 午夜欧美视频| 亚洲欧洲日本mm| 国产精品久久久久久久app| 欧美一级日韩一级| 亚洲高清在线观看| 欧美一区二区播放| 亚洲激情电影在线| 国产精品色婷婷久久58| 美女脱光内衣内裤视频久久影院| 99热这里只有成人精品国产| 久久久久成人精品免费播放动漫| 亚洲人成免费| 国产女主播视频一区二区| 女人天堂亚洲aⅴ在线观看| 一区二区日本视频| 欧美α欧美αv大片| 亚洲欧美在线一区二区| 亚洲激情第一区| 国产视频一区欧美| 欧美日韩a区| 老司机免费视频一区二区| 这里是久久伊人| 亚洲国产一区二区在线| 久久久久se| 欧美一级二区| 99天天综合性| 亚洲国产一区二区三区青草影视| 国产精品男人爽免费视频1| 欧美精品xxxxbbbb| 久久亚洲午夜电影| 小黄鸭精品aⅴ导航网站入口| 亚洲欧洲午夜| 亚洲电影免费观看高清完整版| 久久久www成人免费精品| 亚洲永久网站| 中文久久乱码一区二区| 亚洲人体大胆视频| 亚洲福利视频专区| 一区二区三区亚洲| 国产一区视频网站| 国产日韩亚洲欧美综合| 国产精品久久国产愉拍| 国产精品av免费在线观看| 欧美日韩国产精品自在自线| 欧美成人激情在线| 欧美v亚洲v综合ⅴ国产v| 久久亚裔精品欧美| 久久久噜噜噜久久人人看| 久久激情网站| 久久精品国产一区二区三区免费看| 亚洲一区二区免费视频| 亚洲午夜久久久久久久久电影网| 99国内精品久久| 99精品国产在热久久婷婷| 亚洲免费大片| 一区二区冒白浆视频| 亚洲桃花岛网站| 亚洲一区在线看| 欧美中文字幕视频| 久久久久久9999| 久久久久一区二区三区四区| 久久在线精品| 欧美精品v日韩精品v国产精品 | 老牛嫩草一区二区三区日本| 久久久99免费视频| 裸体丰满少妇做受久久99精品 | 99在线|亚洲一区二区| 亚洲最新色图| 亚洲欧美成人一区二区在线电影| 亚洲欧美国产高清| 久久久国产精品亚洲一区| 你懂的国产精品| 亚洲黄色一区| 亚洲伊人第一页| 久久精品麻豆| 欧美精品网站| 国产片一区二区| 亚洲第一毛片| 亚洲影院色在线观看免费| 久久久av网站| 亚洲片区在线| 欧美亚洲专区| 欧美黄网免费在线观看| 国产乱人伦精品一区二区| 亚洲第一福利视频| 亚洲天堂偷拍| 牛牛国产精品| 亚洲午夜视频在线观看| 裸体一区二区| 国产精品毛片一区二区三区| 精品电影在线观看| 亚洲永久免费观看| 欧美国产三级| 亚洲欧美日韩国产一区二区| 免费日韩精品中文字幕视频在线| 国产精品高潮呻吟久久av无限| 在线观看国产日韩| 午夜一区在线| 亚洲人体偷拍| 久久天堂精品| 国产视频亚洲精品| 在线一区免费观看| 欧美xxx在线观看| 性色一区二区三区| 欧美视频成人| 日韩亚洲视频在线| 欧美成人视屏| 欧美一区二区在线播放| 国产精品劲爆视频| 在线综合亚洲欧美在线视频| 欧美成在线观看| 欧美中文字幕视频在线观看|