{"id":643,"date":"2014-10-06T09:30:00","date_gmt":"2014-10-06T09:30:00","guid":{"rendered":"https:\/\/blogs.msdn.microsoft.com\/visualstudioalm\/2014\/10\/06\/new-breakpoint-configuration-experience-in-visual-studio-2015\/"},"modified":"2022-05-26T05:37:51","modified_gmt":"2022-05-26T13:37:51","slug":"new-breakpoint-configuration-experience-in-visual-studio-2015","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/devops\/new-breakpoint-configuration-experience-in-visual-studio-2015\/","title":{"rendered":"New Breakpoint Configuration Experience in Visual Studio 2015"},"content":{"rendered":"<p>If you use Visual Studio to develop code, the chances are good that you set breakpoints on a regular basis as part of debugging. You may however not be aware that <a href=\"http:\/\/blogs.msdn.com\/b\/visualstudioalm\/archive\/2013\/10\/07\/breakpoints-in-visual-studio-2013.aspx\">breakpoints can be configured with conditions and actions to improve your debugging productivity<\/a>. In <a href=\"http:\/\/go.microsoft.com\/fwlink\/?LinkId=400496\">Visual Studio\u00a02015<\/a> we\u2019re pleased to introduce an improved experience that makes configuring breakpoints significantly easier to find and use for breakpoints associated with a specific line of source code:<\/p>\n<ul>\n<li><a href=\"http:\/\/blogs.msdn.com\/b\/visualstudioalm\/archive\/2013\/10\/11\/conditional-breakpoints.aspx\">Conditional statements<\/a> break only when conditions you specify are met. Think of this as adding an \u201cif\u201d statement to your code and placing the breakpoint inside the \u201cif\u201d statement so it is only hit when the conditions you entered are true.<\/li>\n<li><a href=\"http:\/\/blogs.msdn.com\/b\/visualstudioalm\/archive\/2013\/10\/07\/hit-count-breakpoints.aspx\">Hit counts<\/a> break only after the breakpoint has been hit a certain number of times. These are useful in situations where code is called multiple times, and you either know the exactly when it is failing, or have a general idea that \u201cit fails after at least\u201d a certain number of times.<\/li>\n<li><a href=\"http:\/\/blogs.msdn.com\/b\/visualstudioalm\/archive\/2013\/10\/09\/filter-breakpoints.aspx\">Filters<\/a> break when the breakpoint is hit on a specific thread, process, or machine and are useful for debugging code running in parallel.<\/li>\n<li><a href=\"http:\/\/blogs.msdn.com\/b\/visualstudioalm\/archive\/2013\/10\/10\/tracepoints.aspx\">Tracepoints<\/a> print a message to the output window and are capable of automatically resuming execution. These are useful for doing temporary logging when you need to trace something and don\u2019t want to have to break and manually track values.<\/li>\n<\/ul>\n<p>In this post I\u2019ll show you how to create and configure breakpoints with the new experience. Then we\u2019ll walk through debugging several problems using each type of configured breakpoint along the way.<\/p>\n<h2>Updated Experience<\/h2>\n<p>The first thing you will notice when you set a breakpoint is a small toolbar appears next to the breakpoint glyph (the red circle in the left margin) that has two options, settings, and an enable\/disable breakpoint toggle.<\/p>\n<p><img decoding=\"async\" style=\"border: 0px\" title=\"clip_image002\" src=\"https:\/\/devblogs.microsoft.com\/devops\/wp-content\/uploads\/sites\/6\/2014\/10\/5040.clip_image002_thumb_18B4D17F.jpg\" alt=\"clip_image002\" width=\"627\" height=\"94\" border=\"0\" \/><\/p>\n<p>If you prefer to access the settings from the context menu, we have consolidated the options for accessing the various settings to simply have\u00a0\u201cCondtions\u2026\u201d and &#8220;Actions&#8230;&#8221; for\u00a0entry\u00a0from the glyph itself and to have &#8220;Settings&#8230;&#8221; from the Breakpoints window (if you\u2019ve used these in previous releases of Visual Studio you will remember there was a separate menu option for each type of breakpoint).<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/devops\/wp-content\/uploads\/sites\/6\/2014\/10\/0602.Conditions20Actions20Menu.png\" alt=\"\" border=\"0\" \/><\/p>\n<p><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/devops\/wp-content\/uploads\/sites\/6\/2014\/10\/7028.Settings.png\" alt=\"\" border=\"0\" \/><\/p>\n<p>When you select \u201cSettings\u2026\u201d for the breakpoint a non-modal <a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/dn160178.aspx\">Peek window<\/a> appears in the editor where you can configure all possible settings for the breakpoint. You should think about the possible settings for a breakpoint as falling into two categories:<\/p>\n<ol>\n<li><strong>Conditions<\/strong>: control when the breakpoint is hit, by default a source breakpoint implicitly has the condition of \u201cwhen execution reaches this location\u201d<\/li>\n<li><strong>Actions<\/strong>: control what happens when all of the breakpoints conditions are satisfied. The default implicit action is \u201cbreak\u201d<\/li>\n<\/ol>\n<p>You can see below that the updated UI reflects this way of thinking about breakpoints.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/devops\/wp-content\/uploads\/sites\/6\/2014\/10\/5850.blank20peek20window.png\" alt=\"\" border=\"0\" \/><\/p>\n<p>Since this is a Peek window, it is non-modal and inserted between the lines of code (it is between line 87 and line 88 above, it does not cover any source). This means that I can continue typing, copy and paste from the editor into the dialog, etc. To dismiss it click on the\u00a0&#8220;Close&#8221;\u00a0button. Note that all changes are saved automatically, there is no cancel button.<\/p>\n<p>Tip: You can use the context menu options of &#8220;Conditions&#8230;&#8221; and &#8220;Actions&#8230;&#8221; as a shortcut to open the peek window with the respective checkbox already checked so\u00a0focus is in the edit box ready for input.<\/p>\n<p>To see configuring conditions and actions, continue reading\u2026<\/p>\n<h2>Walkthrough<\/h2>\n<p>The example app we are going to use has Web API services that are consumed by rich client applications. I\u2019ve been asked to create an encoding library so communication between the two is no longer passed in plain text. You can follow along with the post by <a href=\"https:\/\/devblogs.microsoft.com\/wp-content\/uploads\/sites\/6\/2019\/02\/ProjectArchive.zip\">downloading the attached sample<\/a> that uses a <a href=\"http:\/\/en.wikipedia.org\/wiki\/Caesar_cipher\">shift cipher<\/a>. Note: For the purposes of keeping the sample as simple as possible I\u2019ve placed all the logic into a console application, normally I would place the tests in a separate <a href=\"http:\/\/www.visualstudio.com\/en-us\/get-started\/create-and-run-unit-tests-vs.aspx\">unit test project<\/a>.<\/p>\n<p>I\u2019ve written the basic logic, and validated that encoding and decoding \u201cHello World\u201d works as expected. Unfortunately, my next test that checks every ASCII character is failing on character 75.<\/p>\n<p><img decoding=\"async\" style=\"border: 0px\" title=\"clip_image006\" src=\"https:\/\/devblogs.microsoft.com\/devops\/wp-content\/uploads\/sites\/6\/2014\/10\/5732.clip_image006_thumb_1A852746.png\" alt=\"clip_image006\" width=\"521\" height=\"82\" border=\"0\" \/><\/p>\n<h3>Hit counts<\/h3>\n<p>To debug this I set a breakpoint in the <em>applyByteShift<\/em> function (in CustomEncoder.cs, line 84) where I\u2019m doing the byte shift during encoding. Since I know it\u2019s failing on the 75<sup>th<\/sup> character I want the debugger to break only when <em>applyByteShift<\/em> is called by that iteration of the test loop testing. I could use a conditional statement when the byte passed in is 75, but I can\u2019t be sure that isn\u2019t part of the problem. Instead, I will <a href=\"http:\/\/blogs.msdn.com\/b\/visualstudioalm\/archive\/2013\/10\/07\/hit-count-breakpoints.aspx\">set a hit count<\/a> breakpoint to break the 76<sup>th<\/sup> time this function is called (it\u2019s a 0 based loop, so character 75 is passed from the 75 + 1 iteration of the loop) since that will guarantee I break in the failing code path. I open the settings window for the breakpoint, and check the \u201cConditions\u201d checkbox. I see a grid that is waiting for me to enter a <a href=\"http:\/\/blogs.msdn.com\/b\/visualstudioalm\/archive\/2013\/10\/11\/conditional-breakpoints.aspx\">conditional expression<\/a>.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/devops\/wp-content\/uploads\/sites\/6\/2014\/10\/6281.blank20conditions20peek20window.png\" alt=\"\" border=\"0\" \/><\/p>\n<p>Since I\u2019m going to use a hit count instead, I click the dropdown and choose \u201cHit Count\u201d<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/devops\/wp-content\/uploads\/sites\/6\/2014\/10\/4744.hit20count20dropdown20.png\" alt=\"\" border=\"0\" \/><\/p>\n<p>I enter \u201876\u2019 and press Enter. Note, once I\u2019ve specified a valid value, the change will be automatically committed as soon as focus leaves the control whether I press Enter, click outside it, start debugging, or close it.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/devops\/wp-content\/uploads\/sites\/6\/2014\/10\/2438.hit20count20saved.png\" alt=\"\" border=\"0\" \/><\/p>\n<p>I can also change the comparison operator on the Hit Count to choose between <em>equals<\/em>, <em>is a multiple of<\/em>, and <em>greater than or equal to<\/em>.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/devops\/wp-content\/uploads\/sites\/6\/2014\/10\/1300.hitcount20drop20middle.png\" alt=\"\" border=\"0\" \/><\/p>\n<p>To edit the value again, I just need to select the specified value (e.g. by clicking on it) and it will return to an editable state.<\/p>\n<p>At this point I could choose to add another condition if, for example, I wanted to use hit count in combination with a conditional expression or filter. I don\u2019t need that at the moment however so I\u2019ll start debugging and because the Peek window is non-modal I don\u2019t even have to close it! Reminder: changes are automatically saved, there is no cancel after you make an edit.<\/p>\n<p>When the breakpoint is hit, notice that I can see the current hit count in the Peek window, and have the option to reset it.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/devops\/wp-content\/uploads\/sites\/6\/2014\/10\/2117.hitcount201.png\" alt=\"\" border=\"0\" \/><\/p>\n<p>Note: you can see the current hit count for a hit count breakpoint the breakpoint\u2019s tooltip<\/p>\n<p><img decoding=\"async\" style=\"border: 0px\" title=\"clip_image019\" src=\"https:\/\/devblogs.microsoft.com\/devops\/wp-content\/uploads\/sites\/6\/2014\/10\/5037.clip_image019_thumb_6DFE8810.png\" alt=\"clip_image019\" width=\"640\" height=\"144\" border=\"0\" \/><\/p>\n<p>\u2026and the hit count for any breakpoint (regardless of whether it has a hit count condition specified) is shown in the breakpoints window while in debug mode.<\/p>\n<p><img decoding=\"async\" style=\"border: 0px\" title=\"clip_image021\" src=\"https:\/\/devblogs.microsoft.com\/devops\/wp-content\/uploads\/sites\/6\/2014\/10\/1346.clip_image021_thumb_573F4087.jpg\" alt=\"clip_image021\" width=\"628\" height=\"176\" border=\"0\" \/><\/p>\n<p>Once my breakpoint is hit, looking at the data values I can see the bug is that after the byte shift, character 75 becomes 128 which is not a valid ASCII character.<\/p>\n<p><img decoding=\"async\" style=\"border: 0px\" title=\"clip_image022\" src=\"https:\/\/devblogs.microsoft.com\/devops\/wp-content\/uploads\/sites\/6\/2014\/10\/0272.clip_image022_thumb_24DB6D08.png\" alt=\"clip_image022\" width=\"563\" height=\"91\" border=\"0\" \/><\/p>\n<p><em>TIP: *<a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/ea46xwzd.aspx\"><em>You can pin a DataTip to the editor<\/em><\/a><\/em> as shown in the screenshot above*<\/p>\n<p>To fix this issue, I will use modular arithmetic in both applying and removing the byte shift (so 128 will become 1 which is valid).<\/p>\n<p><img decoding=\"async\" style=\"border: 0px\" title=\"clip_image023\" src=\"https:\/\/devblogs.microsoft.com\/devops\/wp-content\/uploads\/sites\/6\/2014\/10\/0513.clip_image023_thumb_448A46D0.png\" alt=\"clip_image023\" width=\"456\" height=\"264\" border=\"0\" \/><\/p>\n<p>Running it again the test for every character now passes<\/p>\n<p><img decoding=\"async\" style=\"border: 0px\" title=\"clip_image024\" src=\"https:\/\/devblogs.microsoft.com\/devops\/wp-content\/uploads\/sites\/6\/2014\/10\/8130.clip_image024_thumb_792AA30B.png\" alt=\"clip_image024\" width=\"469\" height=\"79\" border=\"0\" \/><\/p>\n<p>It\u2019s time to move on to testing this when calling my Web API methods.<\/p>\n<h3>Conditional statements<\/h3>\n<p>The application I\u2019m testing against keeps track of the projects my team has created or collected over the years. I\u2019m going to start by retrieving applications from an API that accepts the desired application type (e.g. Mobile, Desktop, or Web). The goal is to encode the parameter before it is passed, and then decode it on the service side returning matching applications. Running my tests shows that it succeeds for two out of the three types I\u2019m attempting to retrieve.<\/p>\n<p><img decoding=\"async\" style=\"border: 0px\" title=\"clip_image025\" src=\"https:\/\/devblogs.microsoft.com\/devops\/wp-content\/uploads\/sites\/6\/2014\/10\/1780.clip_image025_thumb_6AEC2A1B.png\" alt=\"clip_image025\" width=\"482\" height=\"125\" border=\"0\" \/><\/p>\n<p>I suspect that it isn\u2019t being decoded correctly on the remote side so I want to debug through that code path, but only for the failing case. Meaning I want the debugger to stop when the parameter passed is \u201cDesktop\u201d but not when it\u2019s \u201cMobile\u201d or \u201cWeb\u201d, which is the job of a conditional breakpoint. However, since I suspect the problem is that \u201cDesktop\u201d isn\u2019t being decoded correctly I can\u2019t use that as my condition, instead I will set my conditional statement to break whenever the decoded value is not \u201cMobile\u201d or \u201cWeb\u201d.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/devops\/wp-content\/uploads\/sites\/6\/2014\/10\/1563.ConditionalExpression1.png\" alt=\"\" border=\"0\" \/><\/p>\n<p>It is worth noting that conditional expressions can be as complex or as simple as you need. Any expression that evaluates to a Boolean value in the language your application is written in is valid input.<\/p>\n<p>Now that my breakpoint is set, I <a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/ms165413.aspx\">configure my solution to start both the web project and console application<\/a>, and start debugging. The debugger breaks and I can see that for some reason the word \u201cDesktop\u201d is decoded to \u201cDeskto\u201d<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/devops\/wp-content\/uploads\/sites\/6\/2014\/10\/3527.ConditionalExpression2.png\" alt=\"\" border=\"0\" \/><\/p>\n<h3>Actions<\/h3>\n<p>In order to figure out why the word \u201cDesktop\u201d isn\u2019t being coded correctly, I want to record exactly what each character is encoded to on the client side, and then see the corresponding decoding for the same characters on the server side. I don\u2019t want to have to break for each character and manually record it somewhere, so I\u2019m going to add an action for the debugger to log the characters to the Output window as they are encoded and decoded.<\/p>\n<p>To do this, I set a breakpoint on the function that applies the byte shift, and click the \u201cActions\u201d checkbox to add an action to Log a message (<a href=\"http:\/\/blogs.msdn.com\/b\/visualstudioalm\/archive\/2013\/10\/10\/tracepoints.aspx\">called a tracepoint<\/a>). Also, a second checkbox \u201cContinue execution\u201d appears and is checked by default. When checked, the breakpoint will automatically resume execution of your program after printing the message. If you want the breakpoint to print a message and also stop until you manually resume execution, uncheck this box.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/devops\/wp-content\/uploads\/sites\/6\/2014\/10\/5824.Actions1.png\" alt=\"\" border=\"0\" \/><\/p>\n<p>Additionally, note that the debugger offers information that can be printed by referencing pseudo-variables denoted by a $. In Visual Studio 2015, we\u2019ve added IntelliSense for the available pseudo-variables.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/devops\/wp-content\/uploads\/sites\/6\/2014\/10\/8865.Actions2.png\" alt=\"\" border=\"0\" \/><\/p>\n<p>To debug my current problem I don\u2019t need any of the pseudo-variables, so I\u2019ll change the message to show what the original byte code is, and what it is changed to. Note, that to print values from variables in the application, the variable name needs to be placed inside curly braces (expressions are subject to the same limitations as the watch window, if it cannot be evaluated in the Watch window it cannot be evaluated in a tracepoint). Anything that is not inside of curly braces will be printed as typed. For example \u201cHello world\u201d will appear as \u201cHello world\u201d in the output window, where \u201cHello {world}\u201d will appear as \u201cHello <em><value of variable world><\/em>\u201d.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/devops\/wp-content\/uploads\/sites\/6\/2014\/10\/7608.Actions3.png\" alt=\"\" border=\"0\" \/><\/p>\n<h3>Combining Conditions and Actions<\/h3>\n<p>Next, I\u2019ll move to the function where the byte shift is removed, and add a tracepoint to capture what is happening when the byte shift is removed. However, since I have other tests running that are decoding strings there is the potential for a lot of extra noise in the Output window. To reduce this noise I am going to set this tracepoint to only print when it is hit in the server process, meaning it won\u2019t print anything when this code path is executed in the console application running the tests. A breakpoint conditioned on the process, thread or machine is called a <a href=\"http:\/\/blogs.msdn.com\/b\/visualstudioalm\/archive\/2013\/10\/09\/filter-breakpoints.aspx\">filter breakpoint<\/a>.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/devops\/wp-content\/uploads\/sites\/6\/2014\/10\/5076.Filter1.png\" alt=\"\" border=\"0\" \/><\/p>\n<p>Since I\u2019m running the server code in iisexpress, am going to add a Filter condition of \u2018ProcessName == \u201ciisexpress.exe\u201d. Notice that IntelliSense is now available for the filter properties in Visual Studio 2015.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/devops\/wp-content\/uploads\/sites\/6\/2014\/10\/8780.Filter2.png\" alt=\"\" border=\"0\" \/><\/p>\n<p>When I run this, I see that the last character is being dropped from the string (char 38 is never decoded).<\/p>\n<p><img decoding=\"async\" style=\"border: 0px\" title=\"clip_image041\" src=\"https:\/\/devblogs.microsoft.com\/devops\/wp-content\/uploads\/sites\/6\/2014\/10\/5126.clip_image041_thumb_482D830F.jpg\" alt=\"clip_image041\" width=\"538\" height=\"334\" border=\"0\" \/><\/p>\n<p>A look at ASCII character 38 show it is an \u2018&amp;\u2019 which is a special character when used in URLs. So it is being dropped from the string passed via the URL. To fix this and any other potential problems with special characters, I tweak the code to convert the encoded bytes to a base 64 string instead of ASCII.<\/p>\n<p><img decoding=\"async\" style=\"border: 0px\" title=\"clip_image043\" src=\"https:\/\/devblogs.microsoft.com\/devops\/wp-content\/uploads\/sites\/6\/2014\/10\/5633.clip_image043_thumb_19D3FD62.jpg\" alt=\"clip_image043\" width=\"628\" height=\"263\" border=\"0\" \/><\/p>\n<p>After this change all of my tests are now passing.<\/p>\n<p><img decoding=\"async\" style=\"border: 0px\" title=\"clip_image045\" src=\"https:\/\/devblogs.microsoft.com\/devops\/wp-content\/uploads\/sites\/6\/2014\/10\/3162.clip_image045_thumb_0A33F251.jpg\" alt=\"clip_image045\" width=\"469\" height=\"115\" border=\"0\" \/><\/p>\n<h3>Changing settings from the Breakpoints window<\/h3>\n<p>Breakpoint settings can also be accessed by right-clicking a breakpoint in the Breakpoints window (accessed from the menu by Debug -> Windows -> Breakpoints) and choosing \u201cSettings\u2026\u201d.<\/p>\n<p><img decoding=\"async\" style=\"border: 0px\" title=\"clip_image047\" src=\"https:\/\/devblogs.microsoft.com\/devops\/wp-content\/uploads\/sites\/6\/2014\/10\/8054.clip_image047_thumb_57D01ED1.jpg\" alt=\"clip_image047\" width=\"627\" height=\"223\" border=\"0\" \/><\/p>\n<p>When the settings are opened from the Breakpoints window, the settings UI will be the same that was seen in the Peek window, but it will appear in a dialog box, rather than changing the editor to that source location and opening a Peek window (if instead you wanted to navigate to source for that breakpoint just double click on the breakpoint).<\/p>\n<p>\u00a0<img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/devops\/wp-content\/uploads\/sites\/6\/2014\/10\/4743.Dialog.png\" alt=\"\" border=\"0\" \/><\/p>\n<h2>In Conclusion<\/h2>\n<p>In this post we walked through an example of configuring each possible setting for a breakpoint in the new breakpoints experience. While we didn\u2019t combine the options in all possible ways, hopefully you can see how you can configure breakpoints to debug issues more efficiently. Feel free to <a href=\"https:\/\/devblogs.microsoft.com\/wp-content\/uploads\/sites\/6\/2019\/02\/ProjectArchive.zip\">download the attached sample<\/a> and try it yourself, and read our <a href=\"http:\/\/blogs.msdn.com\/b\/visualstudioalm\/archive\/2013\/10\/07\/breakpoints-in-visual-studio-2013.aspx\">previous posts covering each breakpoint type in more detail<\/a>.<\/p>\n<p>If you have any questions or feedback on our new experience or breakpoints in general I\u2019d love to hear them below, through the Send a Smile feature in Visual Studio, or in our <a href=\"http:\/\/social.msdn.microsoft.com\/Forums\/en-US\/vsdebug\/threads\">MSDN forum<\/a>.<\/p>\n<p><a href=\"https:\/\/devblogs.microsoft.com\/wp-content\/uploads\/sites\/6\/2019\/02\/ProjectArchive.zip\">ProjectArchive.zip<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>If you use Visual Studio to develop code, the chances are good that you set breakpoints on a regular basis as part of debugging. You may however not be aware that breakpoints can be configured with conditions and actions to improve your debugging productivity. In Visual Studio\u00a02015 we\u2019re pleased to introduce an improved experience that [&hellip;]<\/p>\n","protected":false},"author":68,"featured_media":45953,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1,225],"tags":[],"class_list":["post-643","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-devops","category-git"],"acf":[],"blog_post_summary":"<p>If you use Visual Studio to develop code, the chances are good that you set breakpoints on a regular basis as part of debugging. You may however not be aware that breakpoints can be configured with conditions and actions to improve your debugging productivity. In Visual Studio\u00a02015 we\u2019re pleased to introduce an improved experience that [&hellip;]<\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/devops\/wp-json\/wp\/v2\/posts\/643","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/devblogs.microsoft.com\/devops\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devblogs.microsoft.com\/devops\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/devops\/wp-json\/wp\/v2\/users\/68"}],"replies":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/devops\/wp-json\/wp\/v2\/comments?post=643"}],"version-history":[{"count":0,"href":"https:\/\/devblogs.microsoft.com\/devops\/wp-json\/wp\/v2\/posts\/643\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/devops\/wp-json\/wp\/v2\/media\/45953"}],"wp:attachment":[{"href":"https:\/\/devblogs.microsoft.com\/devops\/wp-json\/wp\/v2\/media?parent=643"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/devops\/wp-json\/wp\/v2\/categories?post=643"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/devops\/wp-json\/wp\/v2\/tags?post=643"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}