<?xml version="1.0" encoding="ISO-8859-1" ?>
<rss version="2.0">
<channel>
<title>RodrigoStrauss::WebLog();</title>
<language>pt-br</language>
<link>http://www.1bit.com.br/content.1bit/weblog</link>
<description>Rodrigo Strauss - WebLog</description>
<webMaster>weblog@1bit.com.br</webMaster>
<managingEditor>weblog@1bit.com.br</managingEditor>
<item><title>Palestra do Quinto Encontro: Process Explorer</title><link>http://www.1bit.com.br/content.1bit/weblog/quinto_procexp</link><guid isPermaLink="true">http://www.1bit.com.br/content.1bit/weblog/quinto_procexp</guid><comments>http://www.1bit.com.br/content.1bit/weblog/quinto_procexp#comments</comments><description>&lt;p&gt;Aos que não acompanham a lista de discussão e o site do nosso glorioso &lt;a href=&quot;http://www.ccppbrasil.org&quot;&gt;http://www.ccppbrasil.org&lt;/a&gt;, foi realizado no sábado passado o Quinto Encontro de Programadores C e C++, no espaço cedido pela Microsoft Brasil. Para fazer as honras ao anfitrião e saciar minha vontade de falar sobre os softwares que me salvam a pele todos os dias, falei sobre as ferramentas de apoio à programação, debug e diagnóstico na plataforma Windows.&lt;/p&gt;


&lt;p&gt;Como uma palestra de 1:15hs (um pouco menos se consideramos o problema no som...) não é nem de longe suficiente para explicar todas as ferramentas, vou explicá-las melhor aqui no meu recentemente abandonado blog. Aos que esperam o prosseguimento da série de Win32, vamos esperar a Apple devolver meu carregador que foi para garantia e nunca mais voltou, assim eu consigo recuperar o fonte dos próximos posts. Bom chega de choramingar, daqui a pouco vou começar os posts com &quot;meu querido diário&quot;...&lt;/p&gt;

&lt;p&gt;A primeira ferramenta que eu mostrei, e de longe a mais útil é o &lt;a href=&quot;http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx&quot;&gt;Process Explorer&lt;/a&gt;, o Task Manager vitaminado da Sysinternals:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://i.technet.microsoft.com/bb896653.ProcessExplorer.jpg&quot;/&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://i.technet.microsoft.com/bb896653.ProcessExplorer1.jpg&quot;/&gt;&lt;/p&gt;

&lt;p&gt;Principais usos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Visualizar processos em árvore:&lt;/b&gt; Isso possibilita saber facilmente qual processo iniciou outro processo. CTRL+T&lt;/li&gt;

&lt;li&gt;&lt;b&gt;Finalizar uma árvore de processos:&lt;/b&gt; Muitos programas (setups geralmentes) criam vários processos filhos que fazem o mesmo, ficando difícil finalizar todos os processos criados. Um SHIFT+DEL no processo pai resolve esse problema, matando sem remorso o processo pai e toda sua família.

&lt;li&gt;&lt;b&gt;Mostrar indicadores detalhados de memória:&lt;/b&gt; A pergunta &quot;quanto de memória esse processo está usando?&quot; é vaga e subjetiva. Clicando com o botão direito no header da lista com os processos aparece a opção &quot;Select Columns...&quot;. Na aba &quot;Process Memory&quot; encontramos os indicadores detalhados de memória, como &quot;Private Bytes&quot; e &quot;Working Set&quot;. Mais detalhes sobre isso no material da minha palestra &lt;a href=&quot;http://www.1bit.com.br/content.1bit/weblog/devtech2006_downloads&quot;&gt;&quot;Por Dentro do Windows: Gerenciamento de Memória&quot;&lt;/a&gt; (que eu já ministrei 3 vezes e se me convidarem eu faço de novo, gosto bastante desse assunto)

&lt;li&gt;&lt;b&gt;Saber qual processo está mantendo um determinado arquivo aberto:&lt;/b&gt; CTRL+F, digite o nome do arquivo. Você verá uma lista dos processo que mantém &lt;a href=&quot;http://www.1bit.com.br/content.1bit/weblog/win32_handles&quot;&gt;handles&lt;/a&gt; abertos para esse arquivo.

&lt;li&gt;&lt;b&gt;Visualizar quais conexões TCP/IP o processo mantém:&lt;/b&gt; Duplo clique no processo, depois aba TCP/IP.

&lt;li&gt;&lt;b&gt;Resumo do status do sistema (consumo de processador, memória, I/O, etc):&lt;/b&gt; CTRL+I ou menu View &amp;gt;&amp;gt; System Information. Apesar de parece com a janela do Task Manager, nessa janela temos informações também sobre o I/O total do sistema.

&lt;li&gt;&lt;b&gt;Descobrindo qual processo criou uma determinada janela:&lt;/b&gt; Arraste o último botão da barra de ferramentas (um alvo) para cima da janela. O processo dono será selecionado. Muito útil para descobrir qual dos programas inúteis do fabricante do seu notebook estão ativando aqueles insuportáveis popups. Ou qual das 15 instâncias do seu programa deve ser debugada depois de mostrar um MessageBox(NULL, &quot;Passou por aqui!!!&quot;, &quot;DEBUG&quot;, MB_OK);.

&lt;li&gt;&lt;b&gt;Descobrir quais serviços rodam em uma instância do svchost.exe:&lt;/b&gt; Muitos serviços nativos do Windows são implementados como DLLs que rodam dentro de um dos inúmeros processos do svchost.exe. Abra as propriedades de um processo (duplo clique ou botão direito e &quot;Properties&quot;), você verá uma aba &quot;Services&quot; com a lista.

&lt;li&gt;&lt;b&gt;Descobrir quais processo são do usuário XYZ:&lt;/b&gt; Na tela de seleção de colunas, existe uma coluna &quot;User name&quot; na aba &quot;Process Information&quot;.

&lt;li&gt;&lt;b&gt;Lista de todos os handles (arquivos, sockets, chaves de registro mutexes, events, etc) de um 
processo&lt;/b&gt;: CTRL+H.

&lt;li&gt;&lt;b&gt;Listar DLLs carregadas por um processo&lt;/b&gt;: CTRL+D. Botão direiro + opção &quot;Properties&quot; na DLL e você vê o caminho completo da DLL, sua versão e o nome do fabricante/fornecedor.

&lt;li&gt;&lt;b&gt;Ver os processos que mais consomem CPU: &lt;/b&gt; Na lista de colunas, aba &quot;Process Performance&quot;, escolha a coluna &quot;CPU Time&quot;, que mostra o total de tempo de processador que o processo já consumiu desde seu início. Útil para quem quer economizar bateria do notebook. Ou descobrir qual dos 19 antispywares que seu usuário instalou estão monopolizando a CPU e não deixando muito espaço para sua aplicação (que o usuário gentilmente chama de &quot;carroça&quot;).

&lt;li&gt;&lt;b&gt;Iniciar o Process Explorer minimizado no &quot;tray&quot; na inicialização do Windows:&lt;/b&gt; Crie um atalho do Explorer para o comando &quot;procexp.exe /t&quot; e coloque-o em Start Menu &amp;gt;&amp;gt; Programs &amp;gt;&amp;gt; Startup.

&lt;/ul&gt;

&lt;p&gt;Mais sugestões nos comentários serão bem vindas e muito úteis para quem ler esse post no futuro. E torçam para o deus/santo/padroeiro/entidade/orixá/sei-lá-o-que da organização (deve existir um) me ajude a separar mais tempo para escrever no blog, pois eu realmente gosto de fazer isso...&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;a href=&quot;http://www.1bit.com.br/content.1bit/weblog/quinto_procexp#comments&quot;&gt;3 comentário(s)&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;</description><pubDate>Thu, 09 Oct 2008 03:55:21 GMT</pubDate></item><item><title>E o bug é....</title><link>http://www.1bit.com.br/content.1bit/weblog/bug_exposed</link><guid isPermaLink="true">http://www.1bit.com.br/content.1bit/weblog/bug_exposed</guid><comments>http://www.1bit.com.br/content.1bit/weblog/bug_exposed#comments</comments><description>&lt;p&gt;O bug está no uso incorreto da função &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/ms687025(VS.85).aspx&quot;&gt;WaitForMultipleObjects&lt;/a&gt;:&lt;/p&gt;

&lt;div style=&quot;background-color:#DDDDDD&quot;&gt;
&lt;pre&gt;
DWORD WINAPI WaitForMultipleObjects(
  __in  DWORD nCount,
  __in  const HANDLE *lpHandles,
  __in  BOOL bWaitAll,
  __in  DWORD dwMilliseconds
);
&lt;/pre&gt;
&lt;p&gt;&lt;b&gt;Parameters:&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;nCount [in]:The number of object handles in the array pointed to by lpHandles. The maximum number of object handles is MAXIMUM_WAIT_OBJECTS.
&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;Vendo o valor de MAXIMUM_WAIT_OBJECTS em winnt.h:

&lt;div class=&quot;code&quot;&gt;&lt;pre&gt;
&lt;span class=&quot;keyword&quot;&gt;#define&lt;/span&gt; MAXIMUM_WAIT_OBJECTS 64     &lt;span class=&quot;comment&quot;&gt;// Maximum number of wait objects&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;E no meu post:&lt;/p&gt;

&lt;div class=&quot;code&quot;&gt;&lt;pre&gt;

 &lt;span class=&quot;keyword&quot;&gt;static const&lt;/span&gt; DWORD threadCount = 100;

...

&lt;span class=&quot;comment&quot;&gt;
//
// esperando TODAS as threads retornarem
//             |___________________________________
//                                                 |
//                                                 v
//&lt;/span&gt;
WaitForMultipleObjects(threadCount, &amp;amp;threads[0], TRUE, INFINITE);


&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Não podemos esperar 100 threads de uma vez só. Agora sabemos que o programa não espera todas as threads terminarem antes de mostrar o resultado.&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;a href=&quot;http://www.1bit.com.br/content.1bit/weblog/bug_exposed#comments&quot;&gt;1 comentário(s)&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;</description><pubDate>Tue, 23 Sep 2008 23:23:22 GMT</pubDate></item><item><title>Desafios aos Caçadores de Bugs</title><link>http://www.1bit.com.br/content.1bit/weblog/win32_sync_bug</link><guid isPermaLink="true">http://www.1bit.com.br/content.1bit/weblog/win32_sync_bug</guid><comments>http://www.1bit.com.br/content.1bit/weblog/win32_sync_bug#comments</comments><description>&lt;p&gt;Enquanto escrevia a parte 2 sobre sincronização, encontrei um bug na utilização das funções Win32 na &lt;a href=&quot;http://www.1bit.com.br/content.1bit/weblog/win32_sync_1&quot;&gt;parte 1&lt;/a&gt;. Qual é o bug?&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;a href=&quot;http://www.1bit.com.br/content.1bit/weblog/win32_sync_bug#comments&quot;&gt;6 comentário(s)&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;</description><pubDate>Sat, 13 Sep 2008 04:08:47 GMT</pubDate></item><item><title>Meus bugs fazem as pessoas perderem bastante dinheiro. Ainda bem.</title><link>http://www.1bit.com.br/content.1bit/weblog/oops</link><guid isPermaLink="true">http://www.1bit.com.br/content.1bit/weblog/oops</guid><comments>http://www.1bit.com.br/content.1bit/weblog/oops#comments</comments><description>&lt;p&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Therac-25&quot;&gt;http://en.wikipedia.org/wiki/Therac-25&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;a href=&quot;http://www.1bit.com.br/content.1bit/weblog/oops#comments&quot;&gt;0 comentário(s)&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;</description><pubDate>Tue, 22 Jul 2008 01:14:00 GMT</pubDate></item><item><title>Todos os fontes do meu site pelo Google Code</title><link>http://www.1bit.com.br/content.1bit/weblog/google_code_rocks</link><guid isPermaLink="true">http://www.1bit.com.br/content.1bit/weblog/google_code_rocks</guid><comments>http://www.1bit.com.br/content.1bit/weblog/google_code_rocks#comments</comments><description>&lt;p&gt;Simplesmente muito legal mesmo: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.google.com/codesearch?hl=en&amp;q=show:a5-9huShNYk:56JYvZ5QuX4&amp;sa=N&amp;ct=rdl&amp;cs_p=http://www.1bit.com.br&amp;cs_f=content.1bit/weblog&quot;&gt;Todos (quase todos) os fontes usados no blog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.google.com/codesearch?hl=en&amp;q=show:XBW9g4Qfcio:a5-9huShNYk:R4Qh7usNW5U&amp;sa=N&amp;ct=rd&amp;cs_p=http://www.1bit.com.br&amp;cs_f=content.1bit/weblog/sopa_de_letrinhas_wtl-001&amp;start=1&quot;&gt;Outline do exemplo de WTL.&lt;/a&gt; Clique nos links dos includes e veja&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.google.com/codesearch?hl=en&amp;lr=&amp;q=omni_ptr&quot;&gt;omni_ptr, meu smart pointer COM mais esperto que o os outros&lt;/a&gt;
&lt;/ul&gt;

&lt;p&gt;Putz!&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;a href=&quot;http://www.1bit.com.br/content.1bit/weblog/google_code_rocks#comments&quot;&gt;0 comentário(s)&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;</description><pubDate>Tue, 15 Jul 2008 01:38:36 GMT</pubDate></item></channel>
</rss>