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

C++ Programmer's Cookbook

{C++ 基礎(chǔ)} {C++ 高級(jí)} {C#界面,C++核心算法} {設(shè)計(jì)模式} {C#基礎(chǔ)}

調(diào)試breakpoint高級(jí)

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 夢在天涯 閱讀(3062) 評(píng)論(0)  編輯 收藏 引用 所屬分類: CPlusPlus 、C#/.NET 、VS2005/2008

公告

EMail:itech001#126.com

導(dǎo)航

統(tǒng)計(jì)

  • 隨筆 - 461
  • 文章 - 4
  • 評(píng)論 - 746
  • 引用 - 0

常用鏈接

隨筆分類

隨筆檔案

收藏夾

Blogs

c#(csharp)

C++(cpp)

Enlish

Forums(bbs)

My self

Often go

Useful Webs

Xml/Uml/html

搜索

  •  

積分與排名

  • 積分 - 1816544
  • 排名 - 5

最新評(píng)論

閱讀排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
              欧美一级淫片aaaaaaa视频| 伊人夜夜躁av伊人久久| 麻豆9191精品国产| 国产精品盗摄久久久| 欧美激情国产日韩精品一区18| 国产精品一区免费观看| 亚洲毛片在线看| 亚洲精选在线| 久久久精品国产一区二区三区 | 国产精品丝袜白浆摸在线| 欧美激情精品久久久六区热门 | 激情久久一区| 欧美在线高清视频| 香蕉久久夜色| 欧美午夜无遮挡| 99精品国产在热久久下载| 最近中文字幕日韩精品| 久久久久九九视频| 久久天天躁狠狠躁夜夜爽蜜月| 国产精品网站在线播放| 亚洲性xxxx| 午夜精品视频在线观看| 欧美日韩一卡二卡| 亚洲色图自拍| 欧美专区福利在线| 国产欧美一区二区精品婷婷 | 久久综合亚洲社区| 美腿丝袜亚洲色图| 在线不卡a资源高清| 久久免费视频一区| 欧美电影在线免费观看网站| 亚洲成色777777女色窝| 久久综合色一综合色88| 欧美福利精品| 中日韩在线视频| 国产精品高清在线| 午夜在线视频观看日韩17c| 久久成人免费网| 黄色成人片子| 老司机午夜精品| 亚洲经典在线看| 亚洲视频在线一区观看| 国产精品亚洲综合久久| 久久久久国产一区二区三区| 欧美成人一区二区| 正在播放欧美视频| 国产精品视频久久久| 欧美在线|欧美| 亚洲国产成人久久综合| 一区二区三区日韩欧美精品| 国产精品一二三视频| 久久久久青草大香线综合精品| 欧美大学生性色视频| 亚洲免费观看高清完整版在线观看熊 | 欧美人在线视频| 在线中文字幕一区| 美脚丝袜一区二区三区在线观看| 亚洲激情一区| 国产欧美一区二区三区另类精品| 久久亚洲精品一区二区| 99精品欧美一区二区蜜桃免费| 久久国产精品久久久| 亚洲激情一区二区| 国产农村妇女毛片精品久久莱园子 | 亚洲人成在线观看一区二区| 欧美一区三区二区在线观看| 亚洲国产第一| 国产精品主播| 欧美xx视频| 欧美在线电影| 亚洲少妇最新在线视频| 免费中文日韩| 欧美在线高清| 在线亚洲精品| 91久久精品日日躁夜夜躁欧美| 国产精品黄视频| 欧美成人免费在线| 久久精品国产在热久久| 亚洲一区二区三区视频| 欧美高清一区二区| 久久久久久精| 性一交一乱一区二区洋洋av| 亚洲激情二区| 激情欧美日韩| 国产亚洲综合精品| 欧美性事在线| 欧美日本三区| 欧美成人一区二区三区在线观看| 久久成人在线| 亚洲欧美日韩精品久久亚洲区| 日韩视频在线一区二区| 亚洲国产va精品久久久不卡综合| 久久久久久夜精品精品免费| 亚洲欧美日韩国产| 在线一区二区三区四区| 亚洲毛片av在线| 亚洲精品少妇| 91久久精品一区| 亚洲经典在线| 亚洲国产一区在线| 亚洲国产一区视频| 亚洲国产精品免费| 亚洲国产高清一区| 亚洲国产高清自拍| 亚洲国产美女久久久久| 亚洲第一综合天堂另类专| 狠狠久久亚洲欧美| 国模吧视频一区| 国产一区二区三区黄视频| 国产精品每日更新| 一片黄亚洲嫩模| 国产一区二区欧美日韩| 免费成人高清视频| 亚洲电影免费观看高清完整版在线 | 国产精品第2页| 欧美三日本三级三级在线播放| 欧美日韩免费观看一区二区三区| 欧美成人精品一区二区| 欧美日韩成人综合| 欧美午夜三级| 国产区欧美区日韩区| 国产综合色精品一区二区三区| 好吊一区二区三区| 亚洲国产一区二区三区a毛片| 亚洲欧洲一区二区三区久久| 日韩视频在线免费| 亚洲午夜久久久久久尤物| 午夜国产精品视频免费体验区| 性久久久久久久| 久久另类ts人妖一区二区| 媚黑女一区二区| 亚洲人屁股眼子交8| 亚洲桃色在线一区| 久久gogo国模裸体人体| 免费亚洲电影| 国产精品久线观看视频| 精品999成人| 日韩午夜在线观看视频| 午夜亚洲激情| 母乳一区在线观看| av成人福利| 久久另类ts人妖一区二区| 欧美激情aⅴ一区二区三区| 国产精品久久福利| 在线国产亚洲欧美| 中文精品视频| 免费看精品久久片| 一区二区三区欧美视频| 久久国产精品毛片| 欧美日本不卡高清| 一区免费观看视频| 亚洲影视在线| 欧美福利一区二区| 午夜精品网站| 欧美日韩精品一区二区天天拍小说| 国产日韩欧美夫妻视频在线观看| 91久久黄色| 久久九九全国免费精品观看| 亚洲日本成人| 久久久久在线观看| 国产嫩草一区二区三区在线观看| 亚洲欧洲在线观看| 久久久久欧美精品| 一本色道久久88精品综合| 快射av在线播放一区| 国产欧美在线观看一区| 一区二区三区视频观看| 欧美成人综合网站| 亚洲欧美日韩国产中文在线| 欧美老女人xx| 亚洲日本在线观看| 免费看精品久久片| 久久精品免费看| 国产欧美二区| 亚洲欧美久久久| 亚洲美女视频网| 欧美另类一区| 亚洲精品美女免费| 免费观看亚洲视频大全| 欧美专区中文字幕| 国产女主播一区| 小嫩嫩精品导航| 一区二区三区精品视频| 欧美日韩一区二区三区| 一二三四社区欧美黄| 亚洲国产精品尤物yw在线观看 | 午夜精品福利视频| 欧美午夜一区| 亚洲一区二区视频在线| 9色国产精品| 欧美性猛交一区二区三区精品| 亚洲视频欧美在线| 亚洲色诱最新| 国产精品毛片a∨一区二区三区|国| 一本色道久久88综合亚洲精品ⅰ | 国产精品久久久久国产精品日日| 日韩午夜中文字幕| 亚洲精品综合在线| 欧美视频在线一区二区三区| 亚洲视频福利|