{"id":1567,"date":"2013-07-24T15:49:57","date_gmt":"2013-07-24T13:49:57","guid":{"rendered":"http:\/\/mariusbancila.ro\/blog\/?p=1567"},"modified":"2013-07-24T15:49:57","modified_gmt":"2013-07-24T13:49:57","slug":"visual-studio-2012-debugger-visualizer-for-cptrarray","status":"publish","type":"post","link":"https:\/\/mariusbancila.ro\/blog\/2013\/07\/24\/visual-studio-2012-debugger-visualizer-for-cptrarray\/","title":{"rendered":"Visual Studio 2012 Debugger Visualizer for CPtrArray"},"content":{"rendered":"<p><tt>CPtrArray<\/tt> is a nasty MFC container that should not be used. However, if you deal with legacy code you may not have a choice and have to work with it. Unfortunately, the Visual Studio debugger is not able to display its elements, since these are pointers to void and that can be anything. In this post I will explain how to write a visualizer for Visual Studio 2012 to address this problem.<\/p>\n<h3>Overview<\/h3>\n<p>Visual Studio 2012 has introduced a new framework for writing debugger visualizers for C++ types. This replaces the old autoexp.dat (that you might be familiar with). The new framework offers xml syntax, better diagnostics, versioning and multiple file support.<\/p>\n<p>Visualizers are defined in XML files with extension <strong>.natvis<\/strong>. These visualizers are loaded each time the debugger starts. That means if you make a change to visualizers, it is not necessary to re-start Visual Studio, just re-start the debugger (for instance detach and re-attach the debugger to the process you debug). These files can be located under one of these locations:<\/p>\n<ul>\n<li>%VSINSTALLDIR%\\Common7\\Packages\\Debugger\\Visualizers (requires admin access)<\/li>\n<li>%USERPROFILE%\\My Documents\\Visual Studio 2012\\Visualizers\\<\/li>\n<li>VS extension folders<\/li>\n<\/ul>\n<p>You can read how to write visualizers in these articles:<\/p>\n<ul>\n<li><a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/vstudio\/jj620914.aspx\">Creating custom views of native objects in the debugger<\/a><\/li>\n<li><a href=\"http:\/\/code.msdn.microsoft.com\/Writing-type-visualizers-2eae77a2\">Writing debugger type visualizers for C++ using .natvis files<\/a><\/li>\n<\/ul>\n<h3>Writing the visualizer<\/h3>\n<p>There are two things you must do to enable Visual Studio debugger to display <tt>CPtrArray<\/tt>s in a nice way.<\/p>\n<p>The first step is to define a type derived from <tt>CPtrArray<\/tt>. This type will not be used in code, but will allow the visualizer to figure what is the type of the array elements.<\/p>\n<pre class=\"cpp\" name=\"code\">\r\ntemplate &lt;typename T&gt;\r\nclass CPtrArrayT : public CPtrArray\r\n{\r\n};\r\n<\/pre>\n<p>The second step is to create a .natvis file (let&#8217;s call it <strong>mfc.natvis<\/strong>) under <strong>%USERPROFILE%\\My Documents\\Visual Studio 2012\\Visualizers\\<\/strong> with the following content:<\/p>\n<pre class=\"xml\" name=\"code\">\r\n&lt;?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n&lt;AutoVisualizer xmlns=\"http:\/\/schemas.microsoft.com\/vstudio\/debugger\/natvis\/2010\">\r\n  \r\n  &lt;Type Name=\"CPtrArrayT&amp;lt;*&amp;gt;\">\r\n    &lt;DisplayString>{{CPtrArray m_nSize={m_nSize}}}&lt;\/DisplayString> \r\n    &lt;Expand>\r\n      &lt;Item Name=\"m_nSize\">m_nSize&lt;\/Item>\r\n      &lt;Item Name=\"m_nMaxSize\">m_nMaxSize&lt;\/Item>\r\n      &lt;Item Name=\"m_nGrowBy\">m_nGrowBy&lt;\/Item>\r\n      &lt;IndexListItems>\r\n        &lt;Size>m_nSize&lt;\/Size>\r\n        &lt;ValueNode>($T1*)m_pData[$i]&lt;\/ValueNode>\r\n      &lt;\/IndexListItems>\r\n    &lt;\/Expand>      \r\n  &lt;\/Type>\r\n  \r\n&lt;\/AutoVisualizer>\r\n<\/pre>\n<p>And that&#8217;s all. Let&#8217;s see how this works. Assume we have the following code:<\/p>\n<pre class=\"cpp\" name=\"code\">\r\nstruct FOO\r\n{\r\n   int      a;\r\n   double   b;\r\n   CString  c;\r\n};\r\n\r\nvoid TestArray()\r\n{\r\n   CPtrArray arr;\r\n\r\n   FOO* f1 = new FOO;\r\n   f1->a = 1;\r\n   f1->b = 1.1;\r\n   f1->c = \"one\";\r\n\r\n   FOO* f2 = new FOO;\r\n   f2->a = 2;\r\n   f2->b = 2.2;\r\n   f2->c = \"two\";\r\n\r\n   FOO* f3 = new FOO;\r\n   f3->a = 3;\r\n   f3->b = 3.3;\r\n   f3->c = \"three\";\r\n\r\n   arr.Add(f1);\r\n   arr.Add(f2);\r\n   arr.Add(f3);\r\n\r\n   delete f1;\r\n   delete f2;\r\n   delete f3;\r\n}\r\n<\/pre>\n<p>In the Watch window cast the pointer to the array object to <tt>CPtrArray&lt;T&gt;<\/tt>. This is where the template type defined above is used. Even though your array is not an instance of <tt>CPtrArray&lt;T&gt;<\/tt> it will still work since the derived type does not add anything.<\/p>\n<pre>(CPtrArrayT&lt;FOO&gt;*)&arr,nd<\/pre>\n<p><a href=\"http:\/\/mariusbancila.ro\/blog\/wp-content\/uploads\/2013\/07\/vscptrarrayvis1.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/mariusbancila.ro\/blog\/wp-content\/uploads\/2013\/07\/vscptrarrayvis1.png\" alt=\"vscptrarrayvis1\" width=\"847\" height=\"346\" class=\"alignnone size-full wp-image-1572\" srcset=\"https:\/\/mariusbancila.ro\/blog\/wp-content\/uploads\/2013\/07\/vscptrarrayvis1.png 847w, https:\/\/mariusbancila.ro\/blog\/wp-content\/uploads\/2013\/07\/vscptrarrayvis1-300x122.png 300w\" sizes=\"auto, (max-width: 847px) 100vw, 847px\" \/><\/a><br \/>\nAs you can see in the screenshot, the content of the <tt>CPtrArray<\/tt> is nicely expanded. <\/p>\n<p>You probably noticed the <strong>nd<\/strong> specifier in the watch expression. This specifier (probably standing for &#8220;no derived&#8221;) displays only the base class info of the object, and not the derived parts (see <a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/vstudio\/75w45ekt.aspx\">Format Specifiers in C++<\/a>). Without this specifier, when the MFC symbols are loaded (for mfc110xx.dll) the array is not visualized correctly.<br \/>\n<a href=\"http:\/\/mariusbancila.ro\/blog\/wp-content\/uploads\/2013\/07\/vscptrarrayvis2.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/mariusbancila.ro\/blog\/wp-content\/uploads\/2013\/07\/vscptrarrayvis2.png\" alt=\"vscptrarrayvis2\" width=\"868\" height=\"103\" class=\"alignnone size-full wp-image-1571\" srcset=\"https:\/\/mariusbancila.ro\/blog\/wp-content\/uploads\/2013\/07\/vscptrarrayvis2.png 868w, https:\/\/mariusbancila.ro\/blog\/wp-content\/uploads\/2013\/07\/vscptrarrayvis2-300x35.png 300w\" sizes=\"auto, (max-width: 868px) 100vw, 868px\" \/><\/a><\/p>\n<h3>A simpler hard-coded solution<\/h3>\n<p>If you don&#8217;t want (or cannot) add the generic type <tt>CPtrArray&lt;T&gt;<\/tt> you can still accomplish the same, but with some drawbacks.<\/p>\n<p>In this case the .natvis file should look like this:<\/p>\n<pre class=\"xml\" name=\"code\">\r\n&lt;?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n&lt;AutoVisualizer xmlns=\"http:\/\/schemas.microsoft.com\/vstudio\/debugger\/natvis\/2010\">\r\n  \r\n  &lt;Type Name=\"CPtrArray\">\r\n    &lt;DisplayString>{{CPtrArray m_nSize={m_nSize}}}&lt;\/DisplayString> \r\n    &lt;Expand>\r\n      &lt;Item Name=\"m_nSize\">m_nSize&lt;\/Item>\r\n      &lt;Item Name=\"m_nMaxSize\">m_nMaxSize&lt;\/Item>\r\n      &lt;Item Name=\"m_nGrowBy\">m_nGrowBy&lt;\/Item>\r\n      &lt;IndexListItems>\r\n        &lt;Size>m_nSize&lt;\/Size>\r\n        &lt;ValueNode>(TYPE*)m_pData[$i]&lt;\/ValueNode>\r\n      &lt;\/IndexListItems>\r\n    &lt;\/Expand>      \r\n  &lt;\/Type>\r\n  \r\n&lt;\/AutoVisualizer>\r\n<\/pre>\n<p><em>You must change the placeholder <strong>TYPE<\/strong> with the actual type of the array elements in <strong>ValueNode<\/strong><\/em>. Then, all you have to do is add the object in the watch window.<\/p>\n<p>However, the big disadvantage of this solution is that all the <tt>CPtrArray<\/tt>s in your code are treated in the same manner, as storing elements of type TYPE*. That means if you want to watch arrays of different types, you have to stop the debugger, change the visualizer and attach again. It is impossible to watch arrays that store different element types in the same debugging session.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>CPtrArray is a nasty MFC container that should not be used. However, if you deal with legacy code you may not have a choice and have to work with it. Unfortunately, the Visual Studio debugger is not able to display its elements, since these are pointers to void and that can be anything. In this &#8230; <a title=\"Visual Studio 2012 Debugger Visualizer for CPtrArray\" class=\"read-more\" href=\"https:\/\/mariusbancila.ro\/blog\/2013\/07\/24\/visual-studio-2012-debugger-visualizer-for-cptrarray\/\" aria-label=\"Read more about Visual Studio 2012 Debugger Visualizer for CPtrArray\">Read more<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_uag_custom_page_level_css":"","advgb_blocks_editor_width":"","advgb_blocks_columns_visual_guide":"","_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"jetpack_post_was_ever_published":false},"categories":[7,12,52,10],"tags":[366,35,453,365,55,317],"class_list":["post-1567","post","type-post","status-publish","format-standard","hentry","category-c","category-mfc","category-tools","category-visual-studio","tag-cptrarray","tag-debugger","tag-mfc","tag-visualizers","tag-visualstudio","tag-vs2012"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.3 - aioseo.com -->\n\t<meta name=\"description\" content=\"Learn how to write a visualizer for Visual Studio 2012 debugger to display the content of CPtrArray.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Marius Bancila\"\/>\n\t<meta name=\"keywords\" content=\"visualstudio,vs2012,debugger,mfc,visualizers,cptrarray\" \/>\n\t<link rel=\"canonical\" href=\"https:\/\/mariusbancila.ro\/blog\/2013\/07\/24\/visual-studio-2012-debugger-visualizer-for-cptrarray\/\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"en_US\" \/>\n\t\t<meta property=\"og:site_name\" content=\"Marius Bancila&#039;s Blog | About code. Mostly on C++\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"Visual Studio 2012 Debugger Visualizer for CPtrArray\" \/>\n\t\t<meta property=\"og:description\" content=\"Learn how to write a visualizer for Visual Studio 2012 debugger to display the content of CPtrArray.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/mariusbancila.ro\/blog\/2013\/07\/24\/visual-studio-2012-debugger-visualizer-for-cptrarray\/\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2013-07-24T13:49:57+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2013-07-24T13:49:57+00:00\" \/>\n\t\t<meta name=\"twitter:card\" content=\"summary\" \/>\n\t\t<meta name=\"twitter:title\" content=\"Visual Studio 2012 Debugger Visualizer for CPtrArray\" \/>\n\t\t<meta name=\"twitter:description\" content=\"Learn how to write a visualizer for Visual Studio 2012 debugger to display the content of CPtrArray.\" \/>\n\t\t<script type=\"application\/ld+json\" class=\"aioseo-schema\">\n\t\t\t{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2013\\\/07\\\/24\\\/visual-studio-2012-debugger-visualizer-for-cptrarray\\\/#article\",\"name\":\"Visual Studio 2012 Debugger Visualizer for CPtrArray\",\"headline\":\"Visual Studio 2012 Debugger Visualizer for CPtrArray\",\"author\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/author\\\/admin\\\/#author\"},\"publisher\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/#organization\"},\"image\":{\"@type\":\"ImageObject\",\"url\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/wp-content\\\/uploads\\\/2013\\\/07\\\/vscptrarrayvis1.png\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2013\\\/07\\\/24\\\/visual-studio-2012-debugger-visualizer-for-cptrarray\\\/#articleImage\",\"width\":847,\"height\":346},\"datePublished\":\"2013-07-24T15:49:57+02:00\",\"dateModified\":\"2013-07-24T15:49:57+02:00\",\"inLanguage\":\"en-US\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2013\\\/07\\\/24\\\/visual-studio-2012-debugger-visualizer-for-cptrarray\\\/#webpage\"},\"isPartOf\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2013\\\/07\\\/24\\\/visual-studio-2012-debugger-visualizer-for-cptrarray\\\/#webpage\"},\"articleSection\":\"C++, MFC, Tools, Visual Studio, cptrarray, debugger, MFC, visualizers, VisualStudio, VS2012\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2013\\\/07\\\/24\\\/visual-studio-2012-debugger-visualizer-for-cptrarray\\\/#breadcrumblist\",\"itemListElement\":[{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/#listItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/#listItem\",\"name\":\"IT\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/#listItem\",\"position\":2,\"name\":\"IT\",\"item\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/#listItem\",\"name\":\"Software\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/#listItem\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/#listItem\",\"position\":3,\"name\":\"Software\",\"item\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/c\\\/#listItem\",\"name\":\"C++\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/#listItem\",\"name\":\"IT\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/c\\\/#listItem\",\"position\":4,\"name\":\"C++\",\"item\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/c\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/c\\\/mfc\\\/#listItem\",\"name\":\"MFC\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/#listItem\",\"name\":\"Software\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/c\\\/mfc\\\/#listItem\",\"position\":5,\"name\":\"MFC\",\"item\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/c\\\/mfc\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2013\\\/07\\\/24\\\/visual-studio-2012-debugger-visualizer-for-cptrarray\\\/#listItem\",\"name\":\"Visual Studio 2012 Debugger Visualizer for CPtrArray\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/c\\\/#listItem\",\"name\":\"C++\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2013\\\/07\\\/24\\\/visual-studio-2012-debugger-visualizer-for-cptrarray\\\/#listItem\",\"position\":6,\"name\":\"Visual Studio 2012 Debugger Visualizer for CPtrArray\",\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/category\\\/it\\\/software\\\/c\\\/mfc\\\/#listItem\",\"name\":\"MFC\"}}]},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/#organization\",\"name\":\"Marius Bancila's Blog\",\"description\":\"About code. Mostly on C++\",\"url\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/author\\\/admin\\\/#author\",\"url\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/author\\\/admin\\\/\",\"name\":\"Marius Bancila\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2013\\\/07\\\/24\\\/visual-studio-2012-debugger-visualizer-for-cptrarray\\\/#authorImage\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/a84dd2831d955c38355ddea55df4df260809b88f36408bc14fd4eab8f7f131c9?s=96&d=mm&r=g\",\"width\":96,\"height\":96,\"caption\":\"Marius Bancila\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2013\\\/07\\\/24\\\/visual-studio-2012-debugger-visualizer-for-cptrarray\\\/#webpage\",\"url\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2013\\\/07\\\/24\\\/visual-studio-2012-debugger-visualizer-for-cptrarray\\\/\",\"name\":\"Visual Studio 2012 Debugger Visualizer for CPtrArray\",\"description\":\"Learn how to write a visualizer for Visual Studio 2012 debugger to display the content of CPtrArray.\",\"inLanguage\":\"en-US\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/#website\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/2013\\\/07\\\/24\\\/visual-studio-2012-debugger-visualizer-for-cptrarray\\\/#breadcrumblist\"},\"author\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/author\\\/admin\\\/#author\"},\"creator\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/author\\\/admin\\\/#author\"},\"datePublished\":\"2013-07-24T15:49:57+02:00\",\"dateModified\":\"2013-07-24T15:49:57+02:00\"},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/\",\"name\":\"Marius Bancila's Blog\",\"description\":\"About code. Mostly on C++\",\"inLanguage\":\"en-US\",\"publisher\":{\"@id\":\"https:\\\/\\\/mariusbancila.ro\\\/blog\\\/#organization\"}}]}\n\t\t<\/script>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"Visual Studio 2012 Debugger Visualizer for CPtrArray","description":"Learn how to write a visualizer for Visual Studio 2012 debugger to display the content of CPtrArray.","canonical_url":"https:\/\/mariusbancila.ro\/blog\/2013\/07\/24\/visual-studio-2012-debugger-visualizer-for-cptrarray\/","robots":"max-image-preview:large","keywords":"visualstudio,vs2012,debugger,mfc,visualizers,cptrarray","webmasterTools":{"miscellaneous":""},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/mariusbancila.ro\/blog\/2013\/07\/24\/visual-studio-2012-debugger-visualizer-for-cptrarray\/#article","name":"Visual Studio 2012 Debugger Visualizer for CPtrArray","headline":"Visual Studio 2012 Debugger Visualizer for CPtrArray","author":{"@id":"https:\/\/mariusbancila.ro\/blog\/author\/admin\/#author"},"publisher":{"@id":"https:\/\/mariusbancila.ro\/blog\/#organization"},"image":{"@type":"ImageObject","url":"https:\/\/mariusbancila.ro\/blog\/wp-content\/uploads\/2013\/07\/vscptrarrayvis1.png","@id":"https:\/\/mariusbancila.ro\/blog\/2013\/07\/24\/visual-studio-2012-debugger-visualizer-for-cptrarray\/#articleImage","width":847,"height":346},"datePublished":"2013-07-24T15:49:57+02:00","dateModified":"2013-07-24T15:49:57+02:00","inLanguage":"en-US","mainEntityOfPage":{"@id":"https:\/\/mariusbancila.ro\/blog\/2013\/07\/24\/visual-studio-2012-debugger-visualizer-for-cptrarray\/#webpage"},"isPartOf":{"@id":"https:\/\/mariusbancila.ro\/blog\/2013\/07\/24\/visual-studio-2012-debugger-visualizer-for-cptrarray\/#webpage"},"articleSection":"C++, MFC, Tools, Visual Studio, cptrarray, debugger, MFC, visualizers, VisualStudio, VS2012"},{"@type":"BreadcrumbList","@id":"https:\/\/mariusbancila.ro\/blog\/2013\/07\/24\/visual-studio-2012-debugger-visualizer-for-cptrarray\/#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/#listItem","position":1,"name":"Home","item":"https:\/\/mariusbancila.ro\/blog\/","nextItem":{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/#listItem","name":"IT"}},{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/#listItem","position":2,"name":"IT","item":"https:\/\/mariusbancila.ro\/blog\/category\/it\/","nextItem":{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/#listItem","name":"Software"},"previousItem":{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/#listItem","name":"Home"}},{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/#listItem","position":3,"name":"Software","item":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/","nextItem":{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/c\/#listItem","name":"C++"},"previousItem":{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/#listItem","name":"IT"}},{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/c\/#listItem","position":4,"name":"C++","item":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/c\/","nextItem":{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/c\/mfc\/#listItem","name":"MFC"},"previousItem":{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/#listItem","name":"Software"}},{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/c\/mfc\/#listItem","position":5,"name":"MFC","item":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/c\/mfc\/","nextItem":{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/2013\/07\/24\/visual-studio-2012-debugger-visualizer-for-cptrarray\/#listItem","name":"Visual Studio 2012 Debugger Visualizer for CPtrArray"},"previousItem":{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/c\/#listItem","name":"C++"}},{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/2013\/07\/24\/visual-studio-2012-debugger-visualizer-for-cptrarray\/#listItem","position":6,"name":"Visual Studio 2012 Debugger Visualizer for CPtrArray","previousItem":{"@type":"ListItem","@id":"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/c\/mfc\/#listItem","name":"MFC"}}]},{"@type":"Organization","@id":"https:\/\/mariusbancila.ro\/blog\/#organization","name":"Marius Bancila's Blog","description":"About code. Mostly on C++","url":"https:\/\/mariusbancila.ro\/blog\/"},{"@type":"Person","@id":"https:\/\/mariusbancila.ro\/blog\/author\/admin\/#author","url":"https:\/\/mariusbancila.ro\/blog\/author\/admin\/","name":"Marius Bancila","image":{"@type":"ImageObject","@id":"https:\/\/mariusbancila.ro\/blog\/2013\/07\/24\/visual-studio-2012-debugger-visualizer-for-cptrarray\/#authorImage","url":"https:\/\/secure.gravatar.com\/avatar\/a84dd2831d955c38355ddea55df4df260809b88f36408bc14fd4eab8f7f131c9?s=96&d=mm&r=g","width":96,"height":96,"caption":"Marius Bancila"}},{"@type":"WebPage","@id":"https:\/\/mariusbancila.ro\/blog\/2013\/07\/24\/visual-studio-2012-debugger-visualizer-for-cptrarray\/#webpage","url":"https:\/\/mariusbancila.ro\/blog\/2013\/07\/24\/visual-studio-2012-debugger-visualizer-for-cptrarray\/","name":"Visual Studio 2012 Debugger Visualizer for CPtrArray","description":"Learn how to write a visualizer for Visual Studio 2012 debugger to display the content of CPtrArray.","inLanguage":"en-US","isPartOf":{"@id":"https:\/\/mariusbancila.ro\/blog\/#website"},"breadcrumb":{"@id":"https:\/\/mariusbancila.ro\/blog\/2013\/07\/24\/visual-studio-2012-debugger-visualizer-for-cptrarray\/#breadcrumblist"},"author":{"@id":"https:\/\/mariusbancila.ro\/blog\/author\/admin\/#author"},"creator":{"@id":"https:\/\/mariusbancila.ro\/blog\/author\/admin\/#author"},"datePublished":"2013-07-24T15:49:57+02:00","dateModified":"2013-07-24T15:49:57+02:00"},{"@type":"WebSite","@id":"https:\/\/mariusbancila.ro\/blog\/#website","url":"https:\/\/mariusbancila.ro\/blog\/","name":"Marius Bancila's Blog","description":"About code. Mostly on C++","inLanguage":"en-US","publisher":{"@id":"https:\/\/mariusbancila.ro\/blog\/#organization"}}]},"og:locale":"en_US","og:site_name":"Marius Bancila's Blog | About code. Mostly on C++","og:type":"article","og:title":"Visual Studio 2012 Debugger Visualizer for CPtrArray","og:description":"Learn how to write a visualizer for Visual Studio 2012 debugger to display the content of CPtrArray.","og:url":"https:\/\/mariusbancila.ro\/blog\/2013\/07\/24\/visual-studio-2012-debugger-visualizer-for-cptrarray\/","article:published_time":"2013-07-24T13:49:57+00:00","article:modified_time":"2013-07-24T13:49:57+00:00","twitter:card":"summary","twitter:title":"Visual Studio 2012 Debugger Visualizer for CPtrArray","twitter:description":"Learn how to write a visualizer for Visual Studio 2012 debugger to display the content of CPtrArray."},"aioseo_meta_data":{"post_id":"1567","title":"Visual Studio 2012 Debugger Visualizer for CPtrArray","description":"Learn how to write a visualizer for Visual Studio 2012 debugger to display the content of CPtrArray.","keywords":[{"label":"VisualStudio","value":"VisualStudio"},{"label":"VS2012","value":"VS2012"},{"label":"debugger","value":"debugger"},{"label":"mfc","value":"mfc"},{"label":"visualizers","value":"visualizers"},{"label":"CPtrArray","value":"CPtrArray"}],"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"location":null,"local_seo":null,"breadcrumb_settings":null,"limit_modified_date":false,"ai":null,"created":"2021-03-18 21:12:20","updated":"2025-12-12 07:40:13","seo_analyzer_scan_date":null,"focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"author_meta":{"display_name":"Marius Bancila","author_link":"https:\/\/mariusbancila.ro\/blog\/author\/admin\/"},"featured_img":null,"jetpack_publicize_connections":[],"uagb_featured_image_src":{"full":false,"thumbnail":false,"medium":false,"medium_large":false,"large":false,"1536x1536":false,"2048x2048":false},"uagb_author_info":{"display_name":"Marius Bancila","author_link":"https:\/\/mariusbancila.ro\/blog\/author\/admin\/"},"uagb_comment_info":0,"uagb_excerpt":"CPtrArray is a nasty MFC container that should not be used. However, if you deal with legacy code you may not have a choice and have to work with it. Unfortunately, the Visual Studio debugger is not able to display its elements, since these are pointers to void and that can be anything. In this&hellip;","coauthors":[],"tax_additional":{"categories":{"linked":["<a href=\"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/c\/\" class=\"advgb-post-tax-term\">C++<\/a>","<a href=\"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/c\/mfc\/\" class=\"advgb-post-tax-term\">MFC<\/a>","<a href=\"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/tools\/\" class=\"advgb-post-tax-term\">Tools<\/a>","<a href=\"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/visual-studio\/\" class=\"advgb-post-tax-term\">Visual Studio<\/a>"],"unlinked":["<span class=\"advgb-post-tax-term\">C++<\/span>","<span class=\"advgb-post-tax-term\">MFC<\/span>","<span class=\"advgb-post-tax-term\">Tools<\/span>","<span class=\"advgb-post-tax-term\">Visual Studio<\/span>"]},"tags":{"linked":["<a href=\"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/visual-studio\/\" class=\"advgb-post-tax-term\">cptrarray<\/a>","<a href=\"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/visual-studio\/\" class=\"advgb-post-tax-term\">debugger<\/a>","<a href=\"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/visual-studio\/\" class=\"advgb-post-tax-term\">MFC<\/a>","<a href=\"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/visual-studio\/\" class=\"advgb-post-tax-term\">visualizers<\/a>","<a href=\"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/visual-studio\/\" class=\"advgb-post-tax-term\">VisualStudio<\/a>","<a href=\"https:\/\/mariusbancila.ro\/blog\/category\/it\/software\/visual-studio\/\" class=\"advgb-post-tax-term\">VS2012<\/a>"],"unlinked":["<span class=\"advgb-post-tax-term\">cptrarray<\/span>","<span class=\"advgb-post-tax-term\">debugger<\/span>","<span class=\"advgb-post-tax-term\">MFC<\/span>","<span class=\"advgb-post-tax-term\">visualizers<\/span>","<span class=\"advgb-post-tax-term\">VisualStudio<\/span>","<span class=\"advgb-post-tax-term\">VS2012<\/span>"]}},"comment_count":"0","relative_dates":{"created":"Posted 13 years ago","modified":"Updated 13 years ago"},"absolute_dates":{"created":"Posted on July 24, 2013","modified":"Updated on July 24, 2013"},"absolute_dates_time":{"created":"Posted on July 24, 2013 3:49 pm","modified":"Updated on July 24, 2013 3:49 pm"},"featured_img_caption":"","series_order":"","jetpack_shortlink":"https:\/\/wp.me\/pYNdv-ph","jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/posts\/1567","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/comments?post=1567"}],"version-history":[{"count":12,"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/posts\/1567\/revisions"}],"predecessor-version":[{"id":1581,"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/posts\/1567\/revisions\/1581"}],"wp:attachment":[{"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/media?parent=1567"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/categories?post=1567"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/mariusbancila.ro\/blog\/wp-json\/wp\/v2\/tags?post=1567"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}