{"id":13845,"date":"2017-04-10T21:50:46","date_gmt":"2017-04-11T05:50:46","guid":{"rendered":"https:\/\/blogs.msdn.microsoft.com\/vcblog\/?p=13845"},"modified":"2019-02-18T17:48:37","modified_gmt":"2019-02-18T17:48:37","slug":"c-debugging-and-diagnostics","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/cppblog\/c-debugging-and-diagnostics\/","title":{"rendered":"C++ Debugging and Diagnostics"},"content":{"rendered":"<p>Debugging is one of the cornerstones of software development, and it can consume a significant portion of a developer\u2019s day.\u00a0 The Visual Studio native debugger provides a powerful and feature-rich experience for finding and fixing problems that arise in your applications, no matter the type of problem or how difficult it is to solve.\u00a0 In fact, there are so many debugging features and tools inside Visual Studio that it can be a bit overwhelming for new users.\u00a0 This blog is meant to give you a quick tour of the Visual Studio native debugger and how it can help you in all areas of your C++ development.<\/p>\n<p><strong>Table of Contents<\/strong><\/p>\n<ul>\n<li><a href=\"#breakpoints\">Breakpoints and control flow<\/a><\/li>\n<li><a href=\"#datainspection\">Data inspection and visualization<\/a><\/li>\n<li><a href=\"#diagnostics\">Diagnostic tools and performance profiling<\/a><\/li>\n<li><a href=\"#remote\">Debugging processes and devices<\/a><\/li>\n<li><a href=\"#multithread\">Multi-threaded debugging<\/a><\/li>\n<li><a href=\"#enc\">Edit and continue<\/a><\/li>\n<li><a href=\"#resources\">Other resources<\/a><\/li>\n<\/ul>\n<h2 id=\"breakpoints\">Breakpoints and control flow<\/h2>\n<p>After you have built your application in Visual Studio, you can start the debugger simply by pressing F5.\u00a0 When you start debugging, there are several commands that can help you to navigate the breakpoints in your application so that you can control the state of the program and the current context of the debugger.\u00a0 These commands give you flexible control over the debugger\u2019s scope and what lines and functions of code you want to investigate.<\/p>\n<ul>\n<li><strong>Continue with [F5]: <\/strong>Run to the next break point.<\/li>\n<li><strong>Step over [F10]: <\/strong>Run the next line of code and then break.<\/li>\n<li><strong>Step into [F11]: <\/strong>Step into the function called on the current line of code.<\/li>\n<li><strong>Step out [Shift+F11]: <\/strong>Step out of the current function and break at the next executable line after the function call.<\/li>\n<\/ul>\n<p>When hovering over a breakpoint in your code, you will see two icons appear.\u00a0 The icon on the right with two circles allows you to quickly toggle the current breakpoint on or off without losing the breakpoint marker at this line of code:<\/p>\n<p><a href=\"https:\/\/blogs.msdn.microsoft.com\/vcblog\/?attachment_id=13855\"><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/wp-content\/uploads\/sites\/9\/2019\/02\/breakpoint.png\" alt=\"breakpoint\" width=\"251\" height=\"133\" class=\"alignnone size-full wp-image-13855\" \/><\/a><\/p>\n<p>The icon on the left will launch the list of breakpoint options. Here you can add conditions or actions to a breakpoint.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/wp-content\/uploads\/sites\/9\/2019\/02\/bpmenu.png\" alt=\"bpmenu\" width=\"245\" height=\"144\" class=\"alignnone size-large wp-image-13875\" \/><\/p>\n<p>Sometimes you want a breakpoint to be hit only when a certain condition is satisfied, like x&lt;=5 is true where x is a variable in the debugger scope.\u00a0 <strong>Conditional breakpoints<\/strong> can easily be set in Visual Studio using the inline breakpoint settings window, which allows you to conveniently add conditional breakpoints to your code directly in the source viewer without requiring a modal window.\u00a0 Notice that conditional breakpoints contain a &#8220;+&#8221; sign to indicate at least one condition has been added to the breakpoint.<\/p>\n<p><a href=\"https:\/\/blogs.msdn.microsoft.com\/vcblog\/?attachment_id=13905\"><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/wp-content\/uploads\/sites\/9\/2019\/02\/inlinebp.png\" alt=\"inlinebp\" width=\"879\" height=\"298\" class=\"alignnone size-large wp-image-13905\" \/><\/a><\/p>\n<p>There is also a set of<strong> breakpoint actions <\/strong>that can be performed at a breakpoint, like printing the process ID or the call stack. Visual Studio also refers to these as breakpoint actions as &#8220;tracepoints&#8221;.\u00a0 The inline breakpoint settings window allows you to set a variety of breakpoint actions such as printing the call stack or PID.\u00a0 Notice that when at least one action is assigned to a breakpoint, the breakpoint appears as a diamond shape.\u00a0 In the example below, we have added both a condition and an action to the breakpoint; this makes it appear as a diamond with a &#8220;+&#8221; sign inside.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/wp-content\/uploads\/sites\/9\/2019\/02\/inlinebp2.png\" alt=\"inlinebp2\" width=\"879\" height=\"310\" class=\"alignnone size-large wp-image-13915\" \/><\/p>\n<p><strong>Function breakpoints (watch points)<\/strong> will activate when a specified function is encountered by the debugger.\u00a0 Use the <strong>Debug<\/strong> menu and select <strong>New breakpoint<\/strong> to add a function breakpoint.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/wp-content\/uploads\/sites\/9\/2019\/02\/functionbp.png\" alt=\"functionbp\" width=\"799\" height=\"199\" class=\"alignnone size-large wp-image-13895\" \/><\/p>\n<p><strong>Data breakpoints <\/strong>will stop the debugger when a specific address is hit during debugging.\u00a0 Use the <strong>Debug<\/strong> menu and select <strong>New breakpoint<\/strong> to add a function breakpoint.<\/p>\n<h2 id=\"datainspection\">Data inspection and visualization<\/h2>\n<p>When you are stopped at a breakpoint, the debugger has access to the variable names and values that are currently stored in memory<strong>. <\/strong>\u00a0There are several windows that allow you to view the contents of these objects.<\/p>\n<ul>\n<li><strong>Locals<\/strong>: The locals window lists all variables currently within the debugger scope, which typically includes all static and dynamic allocations made so far in the current function.<\/li>\n<li><strong>Autos: <\/strong>This window provides a list of the variables in memory that originate from:\n<ul>\n<li>The current line at which the breakpoint is set.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<ul>\n<ul>\n<ul>\n<li>Note that in the example below, line 79 has yet to execute. The variable is not yet initialized and there is no value for the Autos window to display.<\/li>\n<\/ul>\n<\/ul>\n<\/ul>\n<ul>\n<li>The previous 3 lines of code. As you can see below, when we are at the breakpoint on line 79, the previous three lines are shown, and the current line awaiting execution has been detected, but the value is not yet available until this line executes.<\/li>\n<\/ul>\n<p><a href=\"https:\/\/blogs.msdn.microsoft.com\/vcblog\/?attachment_id=13865\"><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/wp-content\/uploads\/sites\/9\/2019\/02\/code1.png\" alt=\"code1\" width=\"417\" height=\"64\" class=\"alignnone size-large wp-image-13885\" \/><\/a><\/p>\n<p><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/wp-content\/uploads\/sites\/9\/2019\/02\/autos.png\" alt=\"autos\" width=\"553\" height=\"128\" class=\"alignnone size-full wp-image-13865\" \/><\/p>\n<ul>\n<li><strong>Watch: <\/strong>These windows allows you to track variables of interest as you debug your application. Values are only available when the listed variables are in the scope of the debugger.<\/li>\n<li><strong>Quick Watch<\/strong> is designed for viewing the variable contents without storing it in the Watch window for later viewing. Since the dialog is modal, it is not the best choice for tracking a variable over the entire debugging session: for cases like this the Watch window is preferable.<\/li>\n<\/ul>\n<p><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/wp-content\/uploads\/sites\/9\/2019\/02\/quickwatch.png\" alt=\"quickwatch\" width=\"510\" height=\"397\" class=\"alignnone size-large wp-image-13945\" \/><\/p>\n<ul>\n<li><strong>Memory windows: <\/strong>These provide a more direct view of system memory and are not restricted to what is currently shown in the debugger. They provide the ability to arrange values by bit count, for example 16, 32, and 64. This window is intended primarily for viewing raw unformatted memory contents. Viewing custom data types is not supported here.<\/li>\n<\/ul>\n<p><a href=\"https:\/\/blogs.msdn.microsoft.com\/vcblog\/?attachment_id=13925\"><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/wp-content\/uploads\/sites\/9\/2019\/02\/memorywindow.png\" alt=\"memorywindow\" width=\"765\" height=\"198\" class=\"alignnone size-large wp-image-13925\" \/><\/a><\/p>\n<p><strong>Custom Views of Memory<\/strong><\/p>\n<p>Visual Studio provides the Natvis framework, which enables you to customize the way in which non-primitive native data types are displayed in the variable windows (Locals, Autos, Watches).\u00a0 We ship Natvis visualizers for our libraries, including the Visual C++ STL, ATL, and MFC.\u00a0 It is also easy to create your own Natvis visualizer to customize the way a variable\u2019s contents are displayed in the debugger windows mentioned above.<\/p>\n<p><strong>Creating a Natvis File<\/strong><\/p>\n<p>You can add natvis files to a project or as a top-level solution item for .exe projects.\u00a0 The debugger consumes natvis files that are in a project\/solution.\u00a0 We provide a built-in template under <em>Visual C++ &#8211;&gt;<\/em>\u00a0<em>Utility<\/em> folder for creating a .natvis file.<\/p>\n<p><a href=\"https:\/\/blogs.msdn.microsoft.com\/vcblog\/?attachment_id=13935\"><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/wp-content\/uploads\/sites\/9\/2019\/02\/newnatvis.png\" alt=\"newnatvis\" width=\"879\" height=\"214\" class=\"alignnone size-large wp-image-13935\" \/><\/a><\/p>\n<p>This will add the visualizer to your project for easier tracking and storage via source control.<\/p>\n<p><a href=\"https:\/\/blogs.msdn.microsoft.com\/vcblog\/?attachment_id=13946\"><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/wp-content\/uploads\/sites\/9\/2019\/02\/solnexp.png\" alt=\"solnexp\" width=\"337\" height=\"341\" class=\"alignnone wp-image-13946\" \/><\/a><\/p>\n<p>For more information on how to write .natvis visualizers, consult <a href=\"https:\/\/docs.microsoft.com\/en-us\/visualstudio\/debugger\/create-custom-views-of-native-objects\">the Natvis documentation<\/a><a href=\"https:\/\/docs.microsoft.com\/en-us\/visualstudio\/debugger\/create-custom-views-of-native-objects\"><\/a>.<\/p>\n<p><strong>Modifying Natvis Visualizers While Debugging<\/strong><\/p>\n<p>The following animation shows how editing a natvis for the <em>Volcano<\/em> type will change the debugger display \u00a0inthe variable windows.\u00a0 The top-level display string for the object is changed the to show the <em>m_nativeName<\/em> instead of the <em>m_EnglishName<\/em>.\u00a0 Notice how the changes to the .natvis file are immediately picked up by the debugger and the difference is shown in\u00a0red\u00a0text.\u00a0<a href=\"https:\/\/blogs.msdn.microsoft.com\/vcblog\/?attachment_id=13955\"><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/wp-content\/uploads\/sites\/9\/2019\/02\/natvisedit.gif\" alt=\"natvisedit\" width=\"775\" height=\"366\" class=\"alignnone size-full wp-image-13955\" \/><\/a><\/p>\n<h2 id=\"diagnostics\">Diagnostic tools and performance profiling<\/h2>\n<p>Most profiling tools run in a special mode that is separate from the debugger itself.\u00a0 In Visual Studio, we have added a set of performance and diagnostics tools that can run <em>during <\/em>debugging and provide more insight into the performance and state of your apps. You can control the flow of the application to get to a problem area and then activate more powerful tools as you drill down into the problem. \u00a0Instead of waiting around for the problem to happen, you are able to have full control of the program and decide what information you want to analyze, whether it\u2019s how much time a function spends on the CPU, or viewing the memory usage of each allocation by type. The live CPU and memory usage of your application are displayed in the graph and debugger event are indicated along the timeline. There is a tab for using each of the included diagnostic tools: CPU Usage and Memory Usage.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/wp-content\/uploads\/sites\/9\/2019\/02\/dtwindow.png\" alt=\"dtwindow\" width=\"400\" height=\"459\" class=\"alignnone size-large wp-image-14075\" \/><\/p>\n<p><strong>CPU Usage<\/strong><\/p>\n<p>This tool allows you to view the CPU usage for each function called in a selected time range on the CPU graph.\u00a0 You must enable the tools by clicking the &#8220;CPU Profiling&#8221; button on the left of this tab in order to select a time range for analysis.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/wp-content\/uploads\/sites\/9\/2019\/02\/cpuusage.png\" alt=\"cpuusage\" width=\"628\" height=\"294\" class=\"alignnone size-large wp-image-14065\" \/><\/p>\n<p><strong>Memory Usage<\/strong><\/p>\n<p>This tool enables you to use the memory profiler, which for native profiling must be enabled using the <strong>Heap Profiling<\/strong> button so that you can capture heap snapshots.\u00a0 The button on the left takes a snapshot and you can view the contents of each snapshot by clicking the blue links in the snapshot table.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/wp-content\/uploads\/sites\/9\/2019\/02\/snapshotreel.png\" alt=\"snapshotreel\" width=\"631\" height=\"114\" class=\"alignnone size-large wp-image-14055\" \/><\/p>\n<p>The<strong> Types View <\/strong>shows the types that were resolved from the memory snapshot including the count and total memory footprint.\u00a0 You can navigate to the <strong>Instances View<\/strong> by double-clicking a line in this view.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/wp-content\/uploads\/sites\/9\/2019\/02\/typesview-1024x298.png\" alt=\"typesview\" width=\"879\" height=\"256\" class=\"alignnone size-large wp-image-14045\" \/><\/p>\n<p>The<strong> Instances View <\/strong>shows the types that were resolved from the memory snapshot including the count and total memory footprint.\u00a0 You can navigate to the <strong>Instances View<\/strong> by double-clicking a line in this view.\u00a0 You can navigate back to the types view using the back arrow to the left of the type name.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/wp-content\/uploads\/sites\/9\/2019\/02\/instancesview-1024x193.png\" alt=\"instancesview\" width=\"879\" height=\"166\" class=\"alignnone size-large wp-image-14035\" \/><\/p>\n<p>The<strong> Stacks View <\/strong>shows the call stack for your program and allows you to navigate through the call path of each captured allocation.\u00a0 You can navigate to the <em>stacks view <\/em>from the types view by selecting <strong>Stacks View<\/strong> in the <strong>View Mode<\/strong> dropdown.\u00a0 The top section of this page shows the full execution call stack and can be sorted by callee or caller (in-order or reverse) with the control at the top right called <strong>Aggregate call stack by<\/strong>.\u00a0 The lower section will list all allocation attributable to the selected part of the call stack.\u00a0 Expanding these allocations will show their allocation call stack.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/wp-content\/uploads\/sites\/9\/2019\/02\/stacksview-1024x662.png\" alt=\"stacksview\" width=\"879\" height=\"568\" class=\"alignnone size-large wp-image-14025\" \/><\/p>\n<h2 id=\"remote\">Debugging processes and devices<\/h2>\n<p><strong>Attaching to Process<\/strong><\/p>\n<p>Any process running on your Windows machine can be debugged using Visual Studio.\u00a0 If you want to view the variable types, make sure to have the debug symbols loaded for the process that you are attaching to.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/wp-content\/uploads\/sites\/9\/2019\/02\/attach.png\" alt=\"attach\" width=\"861\" height=\"611\" class=\"alignnone size-large wp-image-14015\" \/><\/p>\n<p><strong>Remote Debugging<\/strong><\/p>\n<p>To remotely debug into another machine that you can connect to via your network, enable the remote debugger via the debugger dropdown.\u00a0 This allows you to debug into a machine no matter how far away it is, as long as you can connect to it over a network.\u00a0 You can also easily debug applications running on external devices such as a Surface tablet.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/wp-content\/uploads\/sites\/9\/2019\/02\/debugselector.png\" alt=\"debugselector\" width=\"248\" height=\"157\" class=\"alignnone size-large wp-image-14005\" \/><\/p>\n<p>The IP address and connection details can be managed in the debugger property page, accessed using either Alt+Enter or right-clicking the project in the Solution Explorer.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/wp-content\/uploads\/sites\/9\/2019\/02\/debugpp.png\" alt=\"debugpp\" width=\"844\" height=\"600\" class=\"alignnone size-large wp-image-13995\" \/><\/p>\n<h2 id=\"multithread\">Multi-threaded debugging<\/h2>\n<p>Visual Studio provides several powerful windows to help debugging multi-threaded applications.\u00a0 The\u00a0<strong>Parallel Stacks<\/strong>\u00a0window is useful when you are debugging multithreaded applications. Its\u00a0<strong>Threads View<\/strong>\u00a0shows call stack information for all the threads in your application. It lets you navigate between threads and stack frames on those threads. In native code, the\u00a0<strong>Tasks View<\/strong>\u00a0shows call stacks of\u00a0<a href=\"https:\/\/msdn.microsoft.com\/en-us\/library\/dd492427.aspx\">task groups<\/a>,\u00a0<a href=\"https:\/\/msdn.microsoft.com\/en-us\/library\/dd470426.aspx\">parallel algorithms<\/a>,\u00a0<a href=\"https:\/\/msdn.microsoft.com\/en-us\/library\/dd551463.aspx\">asynchronous agents<\/a>, and\u00a0<a href=\"https:\/\/msdn.microsoft.com\/en-us\/library\/dd984036.aspx\">lightweight tasks<\/a>.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/wp-content\/uploads\/sites\/9\/2019\/02\/parallelstacks.png\" alt=\"parallelstacks\" width=\"636\" height=\"321\" class=\"alignnone size-large wp-image-13985\" \/><\/p>\n<p>There is also a <strong>Parallel Watch<\/strong> window designed specifically for tracking variables across different threads, showing each thread as a row and each watch (object) as a column.\u00a0 You can also evaluate boolean expressions on the data and export the data to spreadsheet (.csv or Excel) for further analysis.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/wp-content\/uploads\/sites\/9\/2019\/02\/parallelthreads.png\" alt=\"parallelthreads\" width=\"661\" height=\"401\" class=\"alignnone size-large wp-image-13975\" \/><\/p>\n<h2 id=\"enc\">Edit and continue<\/h2>\n<p><strong>Edit and continue<\/strong> allows you to edit some sections of your code during a debugging session without rebuilding, potentially saving a lot of development time.\u00a0 This is enabled by default, and can be toggled or customized using the Debugging options, accessible via the <strong>Debug<\/strong> menu and selecting <strong>Options<\/strong>.<\/p>\n<p><a href=\"https:\/\/blogs.msdn.microsoft.com\/vcblog\/?attachment_id=13965\"><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/wp-content\/uploads\/sites\/9\/2019\/02\/enc.png\" alt=\"enc\" width=\"746\" height=\"437\" class=\"alignnone size-full wp-image-13965\" \/><\/a><\/p>\n<h2 id=\"resources\">Other resources<\/h2>\n<p>If you are interested in some more content and videos about debugging in Visual Studio, check out these links:<\/p>\n<p><strong>Blog posts<\/strong><\/p>\n<ul>\n<li><u>Native memory diagnostics<\/u><\/li>\n<li><a href=\"https:\/\/blogs.msdn.microsoft.com\/vcblog\/2015\/09\/28\/debug-visualizers-in-visual-c-2015\/\">Natvis and debugger visualizers<\/a><\/li>\n<li><a href=\"https:\/\/blogs.msdn.microsoft.com\/vcblog\/2015\/07\/22\/c-edit-and-continue-in-visual-studio-2015\/\">Edit and Continue Blog Post<\/a><\/li>\n<\/ul>\n<p><strong>Related documentation<\/strong><\/p>\n<ul>\n<li><a href=\"https:\/\/docs.microsoft.com\/visualstudio\/debugger\/debugging-native-code\">Debugging Native Code<\/a><\/li>\n<li><a href=\"https:\/\/www.google.com\/search?q=natvis&amp;oq=natvis&amp;aqs=chrome..69i57j0l2j69i59j0l2.614j0j4&amp;sourceid=chrome&amp;ie=UTF-8\">Creating custom views of objects with Natvis<\/a><\/li>\n<li><a href=\"https:\/\/msdn.microsoft.com\/en-us\/library\/esaeyddf.aspx\">Edit and Continue for C++<\/a><\/li>\n<\/ul>\n<p><strong>Videos<\/strong><\/p>\n<ul>\n<li><a href=\"https:\/\/channel9.msdn.com\/Blogs\/Seth-Juarez\/Debugging-101-in-Visual-Studio-with-Andrew-Hall\">Debugging 101 in Visual Studio<\/a><\/li>\n<li><a href=\"https:\/\/channel9.msdn.com\/Shows\/Visual-Studio-Toolbox\/C-Plus-Plus-Debugging-Tips-and-Tricks\">C++ Debugging Tips and Tricks<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Debugging is one of the cornerstones of software development, and it can consume a significant portion of a developer\u2019s day.\u00a0 The Visual Studio native debugger provides a powerful and feature-rich experience for finding and fixing problems that arise in your applications, no matter the type of problem or how difficult it is to solve.\u00a0 In [&hellip;]<\/p>\n","protected":false},"author":295,"featured_media":35994,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[],"class_list":["post-13845","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-cplusplus"],"acf":[],"blog_post_summary":"<p>Debugging is one of the cornerstones of software development, and it can consume a significant portion of a developer\u2019s day.\u00a0 The Visual Studio native debugger provides a powerful and feature-rich experience for finding and fixing problems that arise in your applications, no matter the type of problem or how difficult it is to solve.\u00a0 In [&hellip;]<\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/cppblog\/wp-json\/wp\/v2\/posts\/13845","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/devblogs.microsoft.com\/cppblog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devblogs.microsoft.com\/cppblog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/cppblog\/wp-json\/wp\/v2\/users\/295"}],"replies":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/cppblog\/wp-json\/wp\/v2\/comments?post=13845"}],"version-history":[{"count":0,"href":"https:\/\/devblogs.microsoft.com\/cppblog\/wp-json\/wp\/v2\/posts\/13845\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/cppblog\/wp-json\/wp\/v2\/media\/35994"}],"wp:attachment":[{"href":"https:\/\/devblogs.microsoft.com\/cppblog\/wp-json\/wp\/v2\/media?parent=13845"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/cppblog\/wp-json\/wp\/v2\/categories?post=13845"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/cppblog\/wp-json\/wp\/v2\/tags?post=13845"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}