{"id":1409,"date":"2018-06-23T11:47:41","date_gmt":"2018-06-23T11:47:41","guid":{"rendered":"http:\/\/demensdeum.com\/blog\/?p=1409"},"modified":"2024-12-16T22:32:43","modified_gmt":"2024-12-16T19:32:43","slug":"itgrows","status":"publish","type":"post","link":"https:\/\/demensdeum.com\/blog\/pt\/2018\/06\/23\/itgrows\/","title":{"rendered":"N\u00e3o tenha medo, veja crescer"},"content":{"rendered":"<p>Neste post falarei sobre minhas desventuras com ponteiros inteligentes shared_ptr. Depois de implementar a gera\u00e7\u00e3o do pr\u00f3ximo n\u00edvel em meu jogo <a href=\"https:\/\/gitlab.com\/demensdeum\/Death-Mask\" target=\"_blank\" rel=\"noopener\">Death-Mask<\/a>, notei uma mem\u00f3ria vazar . Cada novo n\u00edvel proporcionou um aumento de + 1 megabyte na RAM consumida. \u00c9 <strong>Obviamente<\/strong> que alguns objetos permaneceram na mem\u00f3ria e n\u00e3o a liberaram. Para corrigir este facto, foi necess\u00e1rio implementar a correcta implementa\u00e7\u00e3o de recursos quando o n\u00edvel se encontra sobrecarregado, o que aparentemente n\u00e3o foi feito. Como usei ponteiros inteligentes, havia v\u00e1rias op\u00e7\u00f5es para resolver esse problema, a primeira envolvia a revis\u00e3o manual do c\u00f3digo (longa e enfadonha), enquanto a segunda envolvia pesquisar os recursos do depurador lldb e do c\u00f3digo-fonte libstdc++ para a possibilidade de rastreamento autom\u00e1tico contra altera\u00e7\u00f5es.<\/p>\n<p>Na Internet, todos os conselhos se resumiam a revisar manualmente o c\u00f3digo, corrigi-lo e bater-se com chicotes depois de encontrar a linha de c\u00f3digo problem\u00e1tica. Tamb\u00e9m foi proposta a implementa\u00e7\u00e3o de um sistema pr\u00f3prio para trabalhar com mem\u00f3ria, como fazem todos os grandes projetos desenvolvidos desde as d\u00e9cadas de 90 e 2000, antes da chegada dos ponteiros inteligentes no padr\u00e3o C++11. Tentei usar pontos de interrup\u00e7\u00e3o no construtor de uma c\u00f3pia de todos os shared_ptrs, mas depois de v\u00e1rios dias nada de \u00fatil aconteceu. Houve uma ideia de adicionar log \u00e0 biblioteca libstdc++, mas os custos de m\u00e3o de obra acabaram sendo monstruosos.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1412\" src=\"https:\/\/demensdeum.com\/blog\/wp-content\/uploads\/2018\/06\/edwardhacking.png\" alt=\"\" width=\"500\" height=\"375\" srcset=\"https:\/\/demensdeum.com\/blog\/wp-content\/uploads\/2018\/06\/edwardhacking.png 500w, https:\/\/demensdeum.com\/blog\/wp-content\/uploads\/2018\/06\/edwardhacking-300x225.png 300w\" sizes=\"auto, (max-width: 500px) 100vw, 500px\" \/><br \/>\nCowboy Bebop (1998)<\/p>\n<p>A solu\u00e7\u00e3o me ocorreu de repente na forma de rastrear altera\u00e7\u00f5es na vari\u00e1vel privada shared_ptr &#8211; use_count. Isso pode ser feito usando watchpoints embutidos no lldb. Depois de criar um shared_ptr via make_shared, as altera\u00e7\u00f5es no contador no lldb podem ser rastreadas usando a linha:<br \/>.<!-- HTML gerado usando hilite.me --><\/p>\n<div style=\"background: #ffffff; overflow: auto; largura: auto; borda: cinza s\u00f3lido; largura da borda: .1em .1em .1em .8em; preenchimento: .2em .6em;\">\n<pre style=\"margin: 0; line-height: 125%;\">assistir <span style=\"color: #008800; font-weight: negrito;\">definir<\/span> <span style=\"color: # 008800; peso da fonte: negrito;\">var<\/span> camera._M_refcount._M_pi->_M_use_count<\/pr\u00e9><\/div>\n<p>Onde a &#8220;c\u00e2mera&#8221; este \u00e9 um objeto shared_ptr cujo estado do contador precisa ser rastreado. Claro, os aspectos internos do shared_ptr ir\u00e3o variar dependendo da vers\u00e3o do libstdc++, mas o princ\u00edpio geral pode ser entendido. Ap\u00f3s instalar o watchpoint, iniciamos os aplicativos e lemos o stacktrace de cada altera\u00e7\u00e3o do contador, depois olhamos o c\u00f3digo (sic!), encontramos o problema e corrigimos. No meu caso, os objetos n\u00e3o foram liberados das tabelas de cache e das tabelas l\u00f3gicas do jogo. Espero que este m\u00e9todo ajude voc\u00ea a lidar com vazamentos ao trabalhar com shared_ptr e ame ainda mais essa ferramenta de mem\u00f3ria. Boa depura\u00e7\u00e3o.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Neste post falarei sobre minhas desventuras com ponteiros inteligentes shared_ptr. Depois de implementar a gera\u00e7\u00e3o do pr\u00f3ximo n\u00edvel em meu jogo Death-Mask, notei uma mem\u00f3ria vazar . Cada novo n\u00edvel proporcionou um aumento de + 1 megabyte na RAM consumida. \u00c9 Obviamente que alguns objetos permaneceram na mem\u00f3ria e n\u00e3o a liberaram. Para corrigir este<a class=\"more-link\" href=\"https:\/\/demensdeum.com\/blog\/pt\/2018\/06\/23\/itgrows\/\">Continue reading <span class=\"screen-reader-text\">&#8220;N\u00e3o tenha medo, veja crescer&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[49,61,52],"tags":[],"class_list":["post-1409","post","type-post","status-publish","format-standard","hentry","category-blog","category-techie","category-tutorials","entry"],"translation":{"provider":"WPGlobus","version":"3.0.2","language":"pt","enabled_languages":["en","ru","zh","de","fr","ja","pt","hi"],"languages":{"en":{"title":true,"content":true,"excerpt":false},"ru":{"title":true,"content":true,"excerpt":false},"zh":{"title":true,"content":true,"excerpt":false},"de":{"title":true,"content":true,"excerpt":false},"fr":{"title":true,"content":true,"excerpt":false},"ja":{"title":true,"content":true,"excerpt":false},"pt":{"title":true,"content":true,"excerpt":false},"hi":{"title":false,"content":false,"excerpt":false}}},"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/1409","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/comments?post=1409"}],"version-history":[{"count":11,"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/1409\/revisions"}],"predecessor-version":[{"id":3979,"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/1409\/revisions\/3979"}],"wp:attachment":[{"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/media?parent=1409"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/categories?post=1409"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/tags?post=1409"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}