<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Caloni.com.br</title>
	
	<link>http://www.caloni.com.br/blog</link>
	<description>C++, Windows, Programação, Depuração e Transpiração</description>
	<lastBuildDate>Wed, 11 Jan 2012 13:22:39 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/caloni/blog" /><feedburner:info uri="caloni/blog" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><creativeCommons:license>http://creativecommons.org/licenses/by-nc-nd/3.0/</creativeCommons:license><item>
		<title>RValue é o novo LValue</title>
		<link>http://feedproxy.google.com/~r/caloni/blog/~3/ju3jocfD9KY/rvalue-e-o-novo-lvalue</link>
		<comments>http://www.caloni.com.br/blog/archives/rvalue-e-o-novo-lvalue#comments</comments>
		<pubDate>Wed, 11 Jan 2012 12:51:05 +0000</pubDate>
		<dc:creator>Wanderley Caloni</dc:creator>
				<category><![CDATA[Blogging]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[c++11]]></category>
		<category><![CDATA[discussões]]></category>
		<category><![CDATA[eventos]]></category>

		<guid isPermaLink="false">http://www.caloni.com.br/blog/?p=1244</guid>
		<description><![CDATA[
As grandes discussões filosóficas que participei durante meu estudo da linguagem C, e mais tarde de C++, muitas vezes convergiam para o significado místico daquela figura que nós da gramática da linguagem conhecemos como lvalue, ou l-value, ou left-value. Enfim, a definição de uma expressão que  [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.caloni.com.br/blog/wp-content/uploads/The-C-Programming-Language.jpg"><img class="aligncenter size-full wp-image-1205" title="The-C-Programming-Language" src="http://www.caloni.com.br/blog/wp-content/uploads/The-C-Programming-Language.jpg" alt="" width="255" height="346" /></a></p>
<p>As grandes discussões filosóficas que participei durante meu estudo da linguagem C, e mais tarde de C++, muitas vezes convergiam para o significado místico daquela figura que nós da gramática da linguagem conhecemos como lvalue, ou l-value, ou left-value. Enfim, a definição de uma expressão que representa um lugar na memória e, portanto, pode ocupar o lado esquerdo de uma atribuição/cópia/passagem de argumentos qualquer. Porém, os "grandes" embates daquela época hoje parecem brincadeira de criança, como a diferença sutil entre ++x e x++ ou convergência de tipos em templates.</p>
<p>Agora o buraco é mais embaixo. Agora temos referências r-value.</p>
<p>Agora o mundo mudou.</p>
<p>Foi necessário que mudasse. C++, conhecido internacionalmente como a vanguarda das linguagens, mesmo mantendo sua fama de alta performance, precisava voltar às suas origens performáticas de qualquer forma. O Criador da linguagem e seus seguidores estavam cientes: cópia de strings é uma coisa muito, muito má. Imperfect forwarding (direcionamento imperfeito?) é algo ainda pior, pois é mais sutil.</p>
<p>Todos concordam, então, que a mudança é necessária. Nem todos concordam, contudo, com o preço a ser pago. As coisas começam a ficar cada vez mais difíceis de entender, e agora, com r-values vindo à superfície, o universo de criaturas bizarras volta a mostrar as caras.</p>
<p>Desde o começo de meus estudos em C++ tenho admirado a linguagem com um certo distanciamento. Enquanto a linguagem C continua sendo o supra-sumo das linguagens de médio-nível, C++ continua sendo uma abominação cujos detalhes muitos preferem esquecer. Mas esquecer tem se tornado cada vez mais difícil frente às <del>gambiarras</del> adaptações técnicas que a linguagem vem sofrendo.</p>
<p>No caso de Rvalues, se antes existia uma discussão interminável sobre sua inclusão no novo padrão, agora existem discussões acerca do que tudo isso significa. Existe até um <a href="http://thbecker.net/articles/rvalue_references/section_01.html">ótimo guia</a> (thanks to <a href="https://twitter.com/#!/pepper_chico">pepper_chico</a>) sobre as principais mudanças de conceitos, feito para simplificar o entendimento. Mas ele mesmo é exageradamente complexo para o programador médio. É de forçar a barra, mesmo. É pedir demais.</p>
<h4>Conversemos</h4>
<p>No próximo dia 28, sábado, nos reuniremos em mais um <a href="https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032503387&amp;Culture=pt-BR">evento C++ organizado </a><del><a href="https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032503387&amp;Culture=pt-BR">pela Microsoft</a></del> <a href="https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032503387&amp;Culture=pt-BR">pelo Grupo C/C++ Brasil</a> e pelos agora dois MVPs do Brasil, o veterano Fabio Galuppo e o novato Rodrigo Strauss (meu amigo, mas acima de tudo muito bem-vindo ao cargo). Estou na lista de palestrantes e conversarei com vocês sobre as otimizações que o famigerado RValue deve trazer à mesa. Espero conseguir entender um pouco mais sobre essa criatura fantástica até lá.</p>
<p>Se o Cebolinha for um programador C++, deve estar se debatendo nesse momento.</p>
<h4>Linques úteis</h4>
<ul>
<li><a href="http://thbecker.net/articles/rvalue_references/section_01.html">C++ Rvalue References Explained</a></li>
<li><a href="http://www.artima.com/cppsource/rvalue.html">A Brief Introduction to Rvalue References</a></li>
<li><a href="http://cpp-next.com/archive/2009/08/want-speed-pass-by-value/">Want Speed? Pass by Value</a></li>
<li><a href="https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032503387&amp;Culture=pt-BR">MSDN Community: C++ Renaissance, São Paulo - SP</a>. <strong>Faça sua incrição!</strong></li>
</ul>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/caloni/blog?a=ju3jocfD9KY:S43cF-rnEms:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/caloni/blog?i=ju3jocfD9KY:S43cF-rnEms:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/caloni/blog/~4/ju3jocfD9KY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.caloni.com.br/blog/archives/rvalue-e-o-novo-lvalue/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://www.caloni.com.br/blog/archives/rvalue-e-o-novo-lvalue</feedburner:origLink></item>
		<item>
		<title>Vida e Software</title>
		<link>http://feedproxy.google.com/~r/caloni/blog/~3/yfg3mxgumPk/vida-e-software</link>
		<comments>http://www.caloni.com.br/blog/archives/vida-e-software#comments</comments>
		<pubDate>Sat, 22 Oct 2011 02:05:27 +0000</pubDate>
		<dc:creator>Wanderley Caloni</dc:creator>
				<category><![CDATA[Devaneando]]></category>
		<category><![CDATA[auto-ajuda]]></category>
		<category><![CDATA[filosofia]]></category>
		<category><![CDATA[vida]]></category>

		<guid isPermaLink="false">http://www.caloni.com.br/blog/?p=1228</guid>
		<description><![CDATA[Fonte: semichaotic.spreadshirt.com
Desenvolver software está bem longe de ser uma ciência exata e muito próxima de ser uma ciência humana. Eu, pessoalmente, considero um ramo esotérico, onde vale muito mais ter a atitude de reconhecer que não temos muito controle sobre como as coisas funcionam do  [...]]]></description>
			<content:encoded><![CDATA[<p><div id="attachment_1229" class="wp-caption alignleft" style="width: 178px"><a href="http://www.caloni.com.br/blog/wp-content/uploads/life-code_design.png"><img class="size-full wp-image-1229 " title="life-code_design" src="http://www.caloni.com.br/blog/wp-content/uploads/life-code_design.png" alt="" width="168" height="168" /></a><p class="wp-caption-text">Fonte: semichaotic.spreadshirt.com</p></div></p>
<p>Desenvolver software está bem longe de ser uma ciência exata e muito próxima de ser uma ciência humana. Eu, pessoalmente, considero um ramo esotérico, onde vale muito mais ter a atitude de reconhecer que não temos muito controle sobre como as coisas funcionam do que querer ter as rédeas de algo desgovernado.</p>
<p>Não sei bem o motivo. Talvez por existirem muitas camadas o software não consegue ser normalizado como as propriedades físicas dos blocos que montam um prédio ou um transatlântico. Ou simplesmente existem variáveis demais na própria camada da aplicação que impedem a compreensão total do problema (como sabemos se estamos dentro da Matrix? Como o software sabe se está em um ambiente virtualizado?).</p>
<p>Para os piores casos, o software sempre vai ter que confiar em seu ambiente e as regras, aparentemente imutáveis, que o regem. Ele precisar confiar não o exime de controlar seus próprio limites, e é aí que recai a atitude do programador, atitude essa que reflete diretamente nossa visão sobre a vida.</p>
<p>Já vi muitos programadores (eu me incluo) deixando o código pronto para o melhor dos mundos e dando a tarefa por concluída. Otimismo demais? Desleixo? Ou arrogância? Qualquer que seja o motivo, ele está incrustado na própria visão de vida do programador e de como ele se vê no mundo. Eu, particularmente, fico horrorizado com código assim. Não com todos, mas com os que são visivelmente importantes e que necessitam de um carinho especial. São os alicerces para outros códigos, de repente.</p>
<p>Outra atitude igualmente deformada é achar que o mundo vai acabar se não existirem todos os sanity checks (até os mais bizarros) em qualquer meia-dúzia de linhas. É o paranóico, que pode se dar bem no tipo de código importante já citado, mas que nunca vai conseguir entregar um projeto trivial se for baseado em libs escritas pelos outros e cujo código nunca deu uma "lida rápida". Aliás, essa mesma atitude "deu uma lida" demonstra que o pessimista pode ser ainda mais arrogante, pois acredita conseguir capturar toda a complexidade do sistema apenas lendo seu código <em>en passant</em>.</p>
<p>De uma forma ou de outra, como toda atividade humana, escrever código nos define não apenas como bons programadores, mas como bons humanos, com seu conjunto de crenças e valores. O que, de certa forma, é um bom sinal, pois melhorando como seres humanos, melhoramos como programadores. E vice-versa.</p>
<h4>Para devanear mais</h4>
<ul>
<li><span class="Apple-style-span" style="line-height: 18px;"><a href="http://www.verdadestraumaticas.com/2011/08/para-que-filosofia-marilena-chaui.html">Para quê filosofia?</a> – Marilena Chauí<br />
</span></li>
</ul>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/caloni/blog?a=yfg3mxgumPk:4YP08BqyKDU:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/caloni/blog?i=yfg3mxgumPk:4YP08BqyKDU:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/caloni/blog/~4/yfg3mxgumPk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.caloni.com.br/blog/archives/vida-e-software/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		<feedburner:origLink>http://www.caloni.com.br/blog/archives/vida-e-software</feedburner:origLink></item>
		<item>
		<title>Depuração de emergência: receita de bolo</title>
		<link>http://feedproxy.google.com/~r/caloni/blog/~3/5b9AUSHBzWM/depuracao-de-emergencia-receita-de-bolo</link>
		<comments>http://www.caloni.com.br/blog/archives/depuracao-de-emergencia-receita-de-bolo#comments</comments>
		<pubDate>Tue, 18 Oct 2011 20:31:29 +0000</pubDate>
		<dc:creator>Wanderley Caloni</dc:creator>
				<category><![CDATA[Depuração]]></category>
		<category><![CDATA[caso real]]></category>
		<category><![CDATA[hands-on]]></category>
		<category><![CDATA[windbg]]></category>

		<guid isPermaLink="false">http://www.caloni.com.br/blog/?p=1220</guid>
		<description><![CDATA[Continuando o papo sobre o que fazer para analisar rapidamente um crash no servidor com o pacote WinDbg, na maioria das vezes a exceção lançada pelo processo está diretamente relacionada com um acesso indevido à memória, o que tem diversas vantagens sobre problemas mais complexos:

Possui  [...]]]></description>
			<content:encoded><![CDATA[<p>Continuando o papo sobre <a href="http://www.caloni.com.br/blog/archives/depuracao-de-emergencia">o que fazer para analisar rapidamente um crash no servidor com o pacote WinDbg</a>, na maioria das vezes a exceção lançada pelo processo está diretamente relacionada com um acesso indevido à memória, o que tem diversas vantagens sobre problemas mais complexos:</p>
<ul>
<li><span class="Apple-style-span" style="line-height: 18px;">Possui localização precisa de onde ocorreu a violação (inclusive com nome do arquivo-fonte e linha).</span></li>
<li><span class="Apple-style-span" style="line-height: 18px;">Não corrompe a pilha (ou, se corrompe, não chega a afetá-la a ponto da thread ficar irreconhecível).</span></li>
<li><span class="Apple-style-span" style="line-height: 18px;">A thread que contém a janela de crash é a culpada imediata (basta olha a pilha!).</span></li>
</ul>
<div><span class="Apple-style-span" style="line-height: 18px;">Bom, resumindo: basta olhar a pilha! Mas, para isso ser efetivo, precisaremos do PDB do executável que gerou o crash, pois através dele é possível puxar a tal localização da violação de acesso.</span></div>
<div>
<p><div id="attachment_1221" class="wp-caption aligncenter" style="width: 521px"><a href="http://www.caloni.com.br/blog/wp-content/uploads/generate-pdb.png"><img class="size-full wp-image-1221 " title="generate-pdb" src="http://www.caloni.com.br/blog/wp-content/uploads/generate-pdb.png" alt="" width="511" height="362" /></a><p class="wp-caption-text">SEMPRE ative a geração de PDBs, até em RELEASE!</p></div></p>
</div>
<div>Se você mantiver executável (DLL também é executável) juntinho com seu PDB, sua vida será mais fácil e florida.</div>
<div>
<p><div id="attachment_1222" class="wp-caption aligncenter" style="width: 508px"><a href="http://www.caloni.com.br/blog/wp-content/uploads/pdb-generated.png"><img class="size-full wp-image-1222 " title="pdb-generated" src="http://www.caloni.com.br/blog/wp-content/uploads/pdb-generated.png" alt="" width="498" height="146" /></a><p class="wp-caption-text">EXE e PDB, juntinhos, cantando e rodando.</p></div></p>
</div>
<div>Mesmo que, em alguns momentos trágicos, apareça uma tela indesejada.</div>
<div><a href="http://www.caloni.com.br/blog/wp-content/uploads/CrashOnServerCrash.png"><img class="aligncenter size-full wp-image-1140" title="CrashOnServerCrash" src="http://www.caloni.com.br/blog/wp-content/uploads/CrashOnServerCrash.png" alt="" width="678" height="342" /></a></div>
<div>Seu caminho a partir dessa tela pode ser analisar um dump gerado (visto no artigo anterior) ou podemos atachar o WinDbg diretamente no processo (visto aqui e agora):</div>
<div>
<dl id="attachment_1223" class="wp-caption aligncenter" style="width: 552px;">
<dt class="wp-caption-dt"><a href="http://www.caloni.com.br/blog/wp-content/uploads/attach-to-process.png"><img class="size-full wp-image-1223 " title="attach-to-process" src="http://www.caloni.com.br/blog/wp-content/uploads/attach-to-process.png" alt="" width="542" height="486" /></a></dt>
<dd class="wp-caption-dd">WinDbg: "mas que bagunça é essa na memória desse processo?"</dd>
</dl>
</div>
<div>O comando mais útil na maioria dos casos é mostrar a pilha em modo verbose (kv e &lt;enter&gt;). Porém, antes disso, precisamos:</div>
<div>
<ol>
<li><span class="Apple-style-span" style="line-height: normal;">Ajeitar o path dos símbolos.</span></li>
<li><span class="Apple-style-span" style="line-height: normal;">Recarregar o PDB do executável suspeito.</span></li>
<li><span class="Apple-style-span" style="line-height: normal;">Mostrar a pilha de todas as threads (até descobrir a culpada).</span></li>
</ol>
<div>Todos esses comandos podem ser vistos abaixo. São, respectivamente, .symfix, .reload e novamente o kv (mas para todas threads).</div>
<pre><span style="color: #ff0000;">0:001&gt; .symfix</span>
<span style="color: #ff0000;">0:001&gt; .reload /f CrashOnServer.exe</span>
*** WARNING: Unable to verify checksum for C:\Users\wanderley.caloni\Documents\Projetos\Caloni\Posts\Debug\CrashOnServer.exe
0:001&gt; kv
Child-SP RetAddr  : Args to Child               : Call Site
0030f918 77679198 : 00000000`00000000 `00000000 : ntdll!DbgBreakPoint
0030f920 775e244d : 00000000`00000000 `00000000 : ntdll!DbgUiRemoteBreakin+0x38
0030f950 00000000 : 00000000`00000000 `00000000 : ntdll!RtlUserThreadStart+0x25
<span style="color: #ff0000;">0:001&gt; ~* kv</span>

   0  Id: 1dc.978 Suspend: 1 Teb: 00000000`7efdb000 Unfrozen
Child-SP RetAddr  : Args to Child                       : Call Site
0008ea48 751f282c : 00000000`77770190 00000000`001dfb50 : wow64cpu!CpupSyscallStub+0x9
0008ea50 7526d07e : 00000000`00000000 00000000`775b3501 : wow64cpu!WaitForMultipleObjects32+0x32
0008eb10 7526c549 : 00000000`00000000 00000000`7ffe0030 : wow64!RunCpuSimulation+0xa
0008eb60 775cae27 : 00000000`003b3710 00000000`7efdf000 : wow64!Wow64LdrpInitialize+0x429
0008f0b0 775c72f8 : 00000000`00000000 00000000`00000000 : ntdll!LdrpInitializeProcess+0x1780
0008f5b0 775b2ace : 00000000`0008f670 00000000`00000000 : ntdll! ?? ::FNODOBFM::`string'+0x2af20
0008f620 00000000 : 00000000`00000000 00000000`00000000 : ntdll!LdrInitializeThunk+0xe</pre>
<p>Ops! Estamos rodando um processo 32 dentro de um SO 64 (Windows 7, por exemplo). Isso pode acontecer. Seguimos com o workaround .load wow64exts e .effmach x86:</p>
<pre><span style="color: #ff0000;">0:001&gt; .load wow64exts</span>
<span style="color: #ff0000;">0:001&gt; .effmach x86</span>
Effective machine: x86 compatible (x86)
<span style="color: #ff0000;">0:001:x86&gt; ~* kv</span>

   0  Id: 1dc.978 Suspend: 1 Teb: 7efdb000 Unfrozen
ChildEBP RetAddr  Args to Child
001df24c 761a0bdd 00000002 001df29c 00000001 ntdll_77760000!NtWaitForMultipleObjects+0x15 (FPO: [5,0,0])
001df2e8 7727162d 001df29c 001df310 00000000 KERNELBASE!WaitForMultipleObjectsEx+0x100 (FPO: [Non-Fpo])
001df330 77271921 00000002 7efde000 00000000 KERNEL32!WaitForMultipleObjectsExImplementation+0xe0 (FPO: [Non-Fpo])
001df34c 77299b2d 00000002 001df380 00000000 KERNEL32!WaitForMultipleObjects+0x18 (FPO: [Non-Fpo])
001df3b8 77299bca 001df498 00000001 00000001 KERNEL32!WerpReportFaultInternal+0x186 (FPO: [Non-Fpo])
001df3cc 772998f8 001df498 00000001 001df468 KERNEL32!WerpReportFault+0x70 (FPO: [Non-Fpo])
001df3dc 77299875 001df498 00000001 38239b1e KERNEL32!BasepReportFault+0x20 (FPO: [Non-Fpo])
001df468 777d0df7 00000000 777d0cd4 00000000 KERNEL32!UnhandledExceptionFilter+0x1af (FPO: [Non-Fpo])
001df470 777d0cd4 00000000 001dfb34 7778c550 ntdll_77760000!__RtlUserThreadStart+0x62 (FPO: [SEH])
001df484 777d0b71 00000000 00000000 00000000 ntdll_77760000!_EH4_CallFilterFunc+0x12 (FPO: [Uses EBP] [0,0,4])
001df4ac 777a6ac9 fffffffe 001dfb24 001df5e8 ntdll_77760000!_except_handler4+0x8e (FPO: [Non-Fpo])
001df4d0 777a6a9b 001df598 001dfb24 001df5e8 ntdll_77760000!ExecuteHandler2+0x26
001df580 7777010f 001df598 001df5e8 001df598 ntdll_77760000!ExecuteHandler+0x24
001df584 001df598 001df5e8 001df598 001df5e8 ntdll_77760000!KiUserExceptionDispatcher+0xf (FPO: [2,0,0])
WARNING: Frame IP not in any known module. Following frames may be wrong.
001df9ac 010d141e 00000000 00000000 00000000 0x1df598
001dfa90 010d19af 00000001 00321410 00321c70 CrashOnServer!main+0x2e (FPO: [Non-Fpo]) (CONV: cdecl)
    [c:\users\wanderley.caloni\documents\projetos\caloni\posts\crashonserver\<span style="color: #ff0000;">crashonserver.cpp @ 13</span>]
001dfae0 010d17df 001dfaf4 77273677 7efde000 CrashOnServer!__tmainCRTStartup+0x1bf (FPO: [Non-Fpo]) (CONV: cdecl)
    [f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c @ 555]
001dfae8 77273677 7efde000 001dfb34 77799f02 CrashOnServer!mainCRTStartup+0xf (FPO: [Non-Fpo]) (CONV: cdecl)
    [f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c @ 371]
001dfaf4 77799f02 7efde000 6b3e1b48 00000000 KERNEL32!BaseThreadInitThunk+0xe (FPO: [Non-Fpo])
001dfb34 77799ed5 010d1109 7efde000 00000000 ntdll_77760000!__RtlUserThreadStart+0x70 (FPO: [Non-Fpo])
001dfb4c 00000000 010d1109 7efde000 00000000 ntdll_77760000!_RtlUserThreadStart+0x1b (FPO: [Non-Fpo])

#  1  Id: 1dc.1b0 Suspend: 1 Teb: 7efd8000 Unfrozen
ChildEBP RetAddr  Args to Child
0056ffe8 00000000 00000000 00000000 00000000 ntdll_77760000!RtlUserThreadStart (FPO: [0,2,0])</pre>
<p>Nosso depurador favorito acusa uma pilha que contém a função WerpReportFault (Web Error Report, mas qualquer outra função com Exception no meio seria uma candidata). E, nessa mesma thread, a última linha nossa conhecida está no arquivo crashonserver.cpp:13. Isso nos revela o seguinte:</p>
<p><div id="attachment_1224" class="wp-caption aligncenter" style="width: 544px"><a href="http://www.caloni.com.br/blog/wp-content/uploads/crash-source.png"><img class="size-full wp-image-1224" title="crash-source" src="http://www.caloni.com.br/blog/wp-content/uploads/crash-source.png" alt="" width="534" height="309" /></a><p class="wp-caption-text">A raiz de todos os nossos problemas!</p></div></p>
<p>E essa situação, caro leitor, é 10% de tudo o que você precisa saber sobre WinDbg para resolver, mas que já resolve 90% dos casos. Belo custo-benefício, não?</p>
</div>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/caloni/blog?a=5b9AUSHBzWM:4U9egr1JeQU:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/caloni/blog?i=5b9AUSHBzWM:4U9egr1JeQU:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/caloni/blog/~4/5b9AUSHBzWM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.caloni.com.br/blog/archives/depuracao-de-emergencia-receita-de-bolo/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.caloni.com.br/blog/archives/depuracao-de-emergencia-receita-de-bolo</feedburner:origLink></item>
		<item>
		<title>Coders at Work: Brendan Eich, threads e depuração</title>
		<link>http://feedproxy.google.com/~r/caloni/blog/~3/LR35gJn6w7A/coders-at-work-brendan-eich-threads-e-depuracao</link>
		<comments>http://www.caloni.com.br/blog/archives/coders-at-work-brendan-eich-threads-e-depuracao#comments</comments>
		<pubDate>Fri, 14 Oct 2011 01:52:03 +0000</pubDate>
		<dc:creator>Wanderley Caloni</dc:creator>
				<category><![CDATA[Blogging]]></category>
		<category><![CDATA[depuração]]></category>
		<category><![CDATA[livros]]></category>
		<category><![CDATA[multithreading]]></category>
		<category><![CDATA[programadores]]></category>

		<guid isPermaLink="false">http://www.caloni.com.br/blog/?p=1208</guid>
		<description><![CDATA["Proofs are hard. Most people are lazy. Larry Wall is right. Laziness should be a virtue. So that’s why I prefer automation. Proofs are something that academics love and most programmers hate." - Brendan Eich
&#160;
Brendan Eich, Pai do JavaScript
Esse pequeno trecho da entrevista de Brendan Eich, de  [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p><em>"Proofs are hard. Most people are lazy. Larry Wall is right. Laziness should be a virtue. So that’s why I prefer automation. Proofs are something that academics love and most programmers hate." - </em>Brendan Eich</p></blockquote>
<p>&nbsp;</p>
<p><div id="attachment_1211" class="wp-caption aligncenter" style="width: 160px"><a href="http://www.caloni.com.br/blog/wp-content/uploads/1202470502643.jpg"><img class="size-thumbnail wp-image-1211 " title="1202470502643" src="http://www.caloni.com.br/blog/wp-content/uploads/1202470502643-150x150.jpg" alt="" width="150" height="150" /></a><p class="wp-caption-text">Brendan Eich, Pai do JavaScript</p></div></p>
<p style="text-align: left;">Esse pequeno trecho da entrevista de Brendan Eich, de <a href="http://www.codersatwork.com/brendan-eich.html">Coders at Work</a>, revela parte das frustações que os programadores de linha de frente sofrem com os ambientes de depuração, muitas vezes aquém dos desafios atuais. Sinceramente, não sinto isso em meu dia-a-dia, e acho o Visual Studio um excelente depurador com interface (mas que perde feio para o WinDbg em casos mais hardcore). Porém, fica a percepção curiosa do criador do JavaScript.</p>
<p><span class="Apple-style-span" style="font-size: 18px; font-weight: bold; line-height: normal;">Sobre SGI</span></p>
<p><em>"Diagnosing it was hard because it was timing-sensitive. It had to do with these machines being abused by terminal concentrators. People were hooking up a bunch of PTYs to real terminals. Students in a lab or a bunch of people in a mining software company in Brisbane, Australia in this sort of ’70s sea of cubes with a glass wall at ’70s sea of cubes with a glass wall at the end, behind which was a bunch of machines including the SGI two-processor machine. That was hard and I’m glad we found it. These bugs generally don’t linger for years but they are really hard to find. And you have to sort of suspend your life and think about them all the time and dream about them and so on. You end up doing very basic stuff, though. It’s like a lot of other bugs. You end up bisecting—you know “wolf fence.” You try to figure out by monitoring execution and the state of memory and try to bound the extent of the bug and control flow and data that can be addressed. If it’s a wild pointer store then you’re kinda screwed and you have to really start looking at harder-to-use tools, which have only come to the fore recently, thanks to those gigahertz processors, like Valgrind and Purify."</em></p>
<p><span class="Apple-style-span" style="font-size: 18px; font-weight: bold; line-height: normal;">Ferramentas de Depuração Avançadas</span></p>
<p><div id="attachment_1212" class="wp-caption aligncenter" style="width: 139px"><a href="http://www.caloni.com.br/blog/wp-content/uploads/ValgrindLogo.png"><img class="size-full wp-image-1212 " title="ValgrindLogo" src="http://www.caloni.com.br/blog/wp-content/uploads/ValgrindLogo.png" alt="" width="129" height="108" /></a><p class="wp-caption-text">Logo da Valgrind</p></div></p>
<p><em>"Instrumenting and having a checked model of the entire memory hierarchy is big. Robert O’Callahan, our big brain in New Zealand, did his own debugger based on the Valgrind framework, which efficiently logs every instruction so he can re-create the entire program state at any point. It’s not just a time-traveling debugger. It’s a full database so you see a data structure and there’s a field with a scrogged value and you can say, “Who wrote to that last?” and you get the full stack. You can reason from effects back to causes. Which is the whole game in debugging. So it’s very slow. It’s like a hundred times slower than real time, but there’s hope."</em></p>
<p><em>"Or you can use one of these faster recording VMs—they checkpoint only at system call and I/O boundaries. They can re-create corrupt program states at any boundary but to go in between those is harder. But if you use that you can probably close in quickly at near real time and then once you get to that stage you can transfer it into Rob’s Chronomancer and run it much slower and get all the program states and find the bug."</em></p>
<p><span class="Apple-style-span" style="font-size: 18px; font-weight: bold; line-height: normal;">Depuradores da Indústria</span></p>
<p><em>"Debugging technology has been sadly underresearched. That’s another example where there’s a big gulf between industry and academia: the academics are doing proofs, sometimes by hand, more and more mechanized thanks to the POPLmark challenge and things like that. But in the real world we’re all in debuggers and they’re pieces of shit from the ’70s like GDB."</em></p>
<p><div id="attachment_1213" class="wp-caption aligncenter" style="width: 210px"><a href="http://www.caloni.com.br/blog/wp-content/uploads/mascot.jpg"><img class="size-full wp-image-1213" title="mascot" src="http://www.caloni.com.br/blog/wp-content/uploads/mascot.jpg" alt="" width="200" height="125" /></a><p class="wp-caption-text">Mascote do GDB</p></div></p>
<p>&nbsp;</p>
<blockquote><p><em>"In the real world one big split is between people who use symbolic debuggers and people who use print statements."</em> - Peter Seibel</p></blockquote>
<p>&nbsp;</p>
<p><em>"Yeah. So I use GDB, and I’m glad GDB, at least on the Mac, has a watch-point facility that mostly works. So I can watch an address and I can catch it changing from good bits to bad bits. That’s pretty helpful. Otherwise I’m using printfs to bisect. Once I get close enough usually I can just try things inside GDB or use some amount of command scripting. But it’s incredibly weak. The scripting language itself is weak. I think Van Jacobson added loops and I don’t even know if those made it into the real GDB, past the FSF hall monitors."</em></p>
<p><span class="Apple-style-span" style="font-size: 18px; font-weight: bold; line-height: normal;">Multithreading</span></p>
<p><em>"But there’s so much more debugging can do for you and these attempts, like Chronomancer and Replay, are good. They certainly changed the game for me recently. But I don’t know about multithreading. There’s The multithreaded stuff, frankly, scares me because before I was married and had kids it took a lot of my life. And not everybody was ready to think about concurrency and all the possible combinations of orders that are out there for even small scenarios. Once you combine code with other people’s code it just gets out of control. You can’t possibly model the state space in your head. Most people aren’t up to it. I could be like one of these chestthumpers on Slashdot—when I blogged about “Threads suck” someone was saying, “Oh he doesn’t know anything. He’s not a real man.” Come on, you idiot. I got a trip to New Zealand and Australia. I got some perks. But it was definitely painful and it takes too long. As Oscar Wilde said of socialism, “It takes too many evenings.”</em></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/caloni/blog?a=LR35gJn6w7A:sZ6roKoNsUA:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/caloni/blog?i=LR35gJn6w7A:sZ6roKoNsUA:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/caloni/blog/~4/LR35gJn6w7A" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.caloni.com.br/blog/archives/coders-at-work-brendan-eich-threads-e-depuracao/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.caloni.com.br/blog/archives/coders-at-work-brendan-eich-threads-e-depuracao</feedburner:origLink></item>
		<item>
		<title>Coders at Work: Jamie Zawinski e Douglas Crockford</title>
		<link>http://feedproxy.google.com/~r/caloni/blog/~3/HKqoVq3bO04/coders-at-work-jamie-zawinski-e-douglas-crockford</link>
		<comments>http://www.caloni.com.br/blog/archives/coders-at-work-jamie-zawinski-e-douglas-crockford#comments</comments>
		<pubDate>Sun, 09 Oct 2011 16:57:56 +0000</pubDate>
		<dc:creator>Wanderley Caloni</dc:creator>
				<category><![CDATA[Blogging]]></category>
		<category><![CDATA[entrevistas]]></category>
		<category><![CDATA[estudo]]></category>
		<category><![CDATA[leituras]]></category>
		<category><![CDATA[metodologia]]></category>
		<category><![CDATA[processos]]></category>
		<category><![CDATA[programação]]></category>

		<guid isPermaLink="false">http://www.caloni.com.br/blog/?p=1201</guid>
		<description><![CDATA["Personally I have never believed that it is possible to be a good coder without being a good programmer nor a good programmer without being a good designer, communicator, and thinker." - Jamie Zawinski
&#160;
Como Joel e Atwood disseram, a leitura de Coders At Work é tão útil quanto ler o código dos  [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p><em>"Personally I have never believed that it is possible to be a good coder without being a good programmer nor a good programmer without being a good designer, communicator, and thinker."</em> - Jamie Zawinski</p></blockquote>
<p>&nbsp;</p>
<p>Como <a href="http://www.joelonsoftware.com/items/2009/09/23.html">Joel</a> e <a href="http://www.codinghorror.com/blog/2009/10/the-interview-with-the-programmer.html">Atwood</a> disseram, a leitura de <a href="http://www.codersatwork.com/">Coders At Work</a> é tão útil quanto ler o código dos outros, só que em um estilo mais condensado, que se aproveita das décadas de experiência dessa gente para aprimorarmos nossos processos de desenvolvimento e, muitas vezes, a forma de pensarmos sobre software.</p>
<p><div id="attachment_1202" class="wp-caption aligncenter" style="width: 213px"><a href="http://www.caloni.com.br/blog/wp-content/uploads/cover-big.jpg"><img class="size-medium wp-image-1202" title="cover-big" src="http://www.caloni.com.br/blog/wp-content/uploads/cover-big-203x300.jpg" alt="" width="203" height="300" /></a><p class="wp-caption-text">Coders at Work: Programadores no Hall da Fama</p></div></p>
<p style="text-align: center;"><a href="http://www.caloni.com.br/blog/wp-content/uploads/cover-big.jpg"><br />
</a></p>
<p>No meu estilo de leitura circular, adaptada do brilhante (maluco?) método de <a href="http://www.softwaregeneralist.com/category/books/">Dmitry Vostokov</a>, as coisas vão mais devagar, e estou apenas no início do livro, tendo passado por <strong>Jamie Zawinski</strong> (desenvolvedor da equipe original do Netscape), Brad Fitzpatrick (criador do Live Journal) e terminado recentemente <strong>Douglas Crockford</strong>. O artigo de Joel sobre Zawinski demonstra seu apreço pelo codificador pensante, ou aquele que faz as coisas acontecerem e não fica preso eternamente na armadilha da arquitetura. Eu acredito que as seguintes passagens do livro demonstram seu pensamento melhor do que se eu fosse tentar traduzi-los.</p>
<h4>Jamie Zawinski</h4>
<p><div id="attachment_1217" class="wp-caption aligncenter" style="width: 196px"><a href="http://www.caloni.com.br/blog/wp-content/uploads/jamie.jpg"><img class="size-full wp-image-1217" title="jamie" src="http://www.caloni.com.br/blog/wp-content/uploads/jamie.jpg" alt="" width="186" height="213" /></a><p class="wp-caption-text">Jamie Zawinski</p></div></p>
<p><em>"Personally I have never believed that it is possible to be a good coder without being a good programmer nor a good programmer without being a good designer, communicator, and thinker. (...) Start converting it into the bad one until it stops working. That’s primary tool of reverse engineering. (...) Your competitor’s six-month 1.0 has crap code and they’re going to have to rewrite it in two years but, guess what: they can rewrite it because you don’t have a job anymore. (...) The design process is definitely an ongoing thing; you never know what the design is until the program is done. So I prefer to get my feet wet as early as possible; get something on the screen so I can look at it sideways.(...) I’ve noticed that one thing that separates good programmers from bad programmers is that good programmers are more facile at jumping between layers of abstraction—they can keep the layers distinct while making changes and choose the right layer to make changes in. (...) I think one of the most important things, for me anyway, when building something from the ground up like that is, as quickly as possible, getting the program to a state that you, the programmer, can use it. Even a little bit. Because that tells you where to go next in a really visceral way. (...) I don’t want to be a mathematician but I’m not going to criticize someone who is a mathematician. It’s weird that people often confuse those two pursuits. People who are into very theoretical computer science are thought of in this same way as people who are shipping desktop applications. And they don’t really have a lot to do with each other. (...) Then there was another book that everybody thought was the greatest thing ever in that same period—Design Patterns—which I just thought was crap. It was just like, programming via cut and paste. Rather than thinking through your task you looked through the recipe book and found something that maybe, kinda, sorta felt like it, and then just aped it. That’s not programming; that’s a coloring book. (...)"</em></p>
<h4>Douglas Crockford</h4>
<p>De certa forma, o mesmo pragmatismo pode ser observado em Douglas Crockford, que utiliza o método de leitura de código tanto na entrevista por candidatos ("traga-me o código que tem orgulho de ter escrito e explique-o pra mim") quanto no dia-a-dia do projeto, para que todos entendam e aproveitem a evolução do projeto como um todo, além de constituir, na minha visão, uma das melhores dicas de auto-management que uma equipe de programadores poderia ter.</p>
<p><div id="attachment_1218" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.caloni.com.br/blog/wp-content/uploads/crockford.png"><img class="size-medium wp-image-1218" title="crockford" src="http://www.caloni.com.br/blog/wp-content/uploads/crockford-300x300.png" alt="" width="300" height="300" /></a><p class="wp-caption-text">Douglas Crockford</p></div></p>
<p><em>"One of the things I’ve been pushing is code reading. I think that is the most useful thing that a community of programmers can do for each other—spend time on a regular basis reading each other’s code. There’s a tendency in project management just to let the programmers go off independently and then we have the big merge and then we have the big merge and if it builds then we ship it and we’re done and we forget about it. One of the consequences of that is that if you have weak or confused programmers you’re not aware of their actual situation until much too late. And so the risks to the project, that you’re that you’re going to have to build with stuff that’s bad and the delays that that causes, that’s unacceptable. The other thing is that you may have brilliant programmers on the project who are not adequately mentoring the other people on the team. Code reading solves both of those problems.</em>"</p>
<p><strong>Seibel</strong>: Can you talk a bit about how you conduct a code reading?</p>
<p><em>"At each meeting, someone’s responsible for reading their code, and they’ll walk us through everything, and the rest of us will observe. It’s a really good chance for the rest of the team to understand how their stuff is going to have to fit with that stuff."</em></p>
<p><em>"We get everybody around the table; everybody gets a stack of paper. We also blow it up on the screen. And we all read through it together. And we’re all commenting on the code as we go along. People say, “I don’t understand this comment,” or, “This comment doesn’t seem to describe the code.” That kind of stuff can be so valuable because as a programmer you stop reading your own comments and you’re not aware that you’re misdirecting the reader. Having the people you work with helping to keep your code clean is a huge service—you find defects that you never would’ve found on your own."</em></p>
<p><em>"I think an hour of code reading is worth two weeks of QA. It’s just a really effective way of removing errors. If you have someone who is strong reading, then the novices around them are going to learn a lot that they wouldn’t be learning otherwise, and if you have a novice reading, he’s going to get a lot of really good advice."</em></p>
<p><strong>Seibel</strong>: So if you don’t clean up every seventh cycle you may be faced with the choice of whether or not to do a big rewrite. How do you know when, if ever, it’s time for a big rewrite?</p>
<p><em>"Generally the team knows when it’s time. Management finds out a lot later. The team is getting beat up pretty regularly, making too many pretty regularly, making too many bugs; the code’s too big, it’s too slow; we’re falling behind. They know why. It’s not because they became stupider or lazier. It’s because the code base is no longer serving the purpose that it needs to."</em></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/caloni/blog?a=HKqoVq3bO04:6g-VSDnk2SU:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/caloni/blog?i=HKqoVq3bO04:6g-VSDnk2SU:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/caloni/blog/~4/HKqoVq3bO04" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.caloni.com.br/blog/archives/coders-at-work-jamie-zawinski-e-douglas-crockford/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.caloni.com.br/blog/archives/coders-at-work-jamie-zawinski-e-douglas-crockford</feedburner:origLink></item>
		<item>
		<title>Oitavo Encontro do Grupo C/C++ Brasil</title>
		<link>http://feedproxy.google.com/~r/caloni/blog/~3/IWw5Ob6PXdE/oitavo-encontro-do-grupo-cc-brasil</link>
		<comments>http://www.caloni.com.br/blog/archives/oitavo-encontro-do-grupo-cc-brasil#comments</comments>
		<pubDate>Mon, 19 Sep 2011 02:10:02 +0000</pubDate>
		<dc:creator>Wanderley Caloni</dc:creator>
				<category><![CDATA[Blogging]]></category>
		<category><![CDATA[ccpp]]></category>
		<category><![CDATA[eventos]]></category>

		<guid isPermaLink="false">http://www.caloni.com.br/blog/?p=1159</guid>
		<description><![CDATA[Esse final de semana ocorreu mais um dos inesquecíveis encontros dos programadores C++, dessa vez ao estilo "velhos tempos", com direito a entrada gratuita e um grupo mais coeso, quase já íntimo, e mais animado.

Não só pela informalidade da ocasião, tivemos palestras interessantes que dessa vez  [...]]]></description>
			<content:encoded><![CDATA[<p>Esse final de semana ocorreu mais um dos inesquecíveis encontros dos programadores C++, dessa vez ao estilo "velhos tempos", com direito a entrada gratuita e um grupo mais coeso, quase já íntimo, e mais animado.</p>
<p><a href="http://www.caloni.com.br/blog/wp-content/uploads/bscap0000.jpg"><img class="aligncenter size-full wp-image-1160" title="bscap0000" src="http://www.caloni.com.br/blog/wp-content/uploads/bscap0000.jpg" alt="" width="430" height="323" /></a></p>
<p>Não só pela informalidade da ocasião, tivemos palestras interessantes que dessa vez conseguiram abranger temas bem diversificados e fugir um pouco do feijão-com-arroz de desenvolvimento Windows que muitos encontros anteriores haviam se transformado.</p>
<p><a href="http://www.caloni.com.br/blog/wp-content/uploads/bscap0001.jpg"><img class="aligncenter size-full wp-image-1161" title="bscap0001" src="http://www.caloni.com.br/blog/wp-content/uploads/bscap0001.jpg" alt="" width="430" height="323" /></a></p>
<p>Logo no começo do dia tivemos Vinicius Jarina apresentando-nos a possibilidade de usar Lua como um script rápido de embutir em código C++ sem muitos percalços.</p>
<p><a href="http://www.caloni.com.br/blog/wp-content/uploads/bscap0004.jpg"><img class="aligncenter size-full wp-image-1162" title="bscap0004" src="http://www.caloni.com.br/blog/wp-content/uploads/bscap0004.jpg" alt="" width="430" height="322" /></a></p>
<p>Já o mesmo não se pode dizer dos detalhes quase sempre matadores do desenvolvimento mobile, como vimos com Gianni Rossi.</p>
<p><a href="http://www.caloni.com.br/blog/wp-content/uploads/bscap0011.jpg"><img class="aligncenter size-full wp-image-1163" title="bscap0011" src="http://www.caloni.com.br/blog/wp-content/uploads/bscap0011.jpg" alt="" width="430" height="322" /></a></p>
<p>Como não poderia deixar de faltar, Rodrigo Strauss nos apresenta, agora formalizadas, as mudanças do novo padrão C++ que acaba de ser aprovado.</p>
<p>Em seguida, Rodrigo Kumpera mais uma vez apresenta um debate que parece recorrente no grupo, discorrendo sobre modelos de memória e a dificuldade de sicronizar diversos recursos em múltiplas CPUs.</p>
<p><a href="http://www.caloni.com.br/blog/wp-content/uploads/bscap0015.jpg"><img class="aligncenter size-full wp-image-1164" title="bscap0015" src="http://www.caloni.com.br/blog/wp-content/uploads/bscap0015.jpg" alt="" width="430" height="322" /></a></p>
<p>Para finalizar, uma palestra-bônus de <del>um rapaz que infelizmente não consegui lembrar o nome (nosso saite, nesse momento, está fora do ar), mas</del> Marcelo Zimbres Silva (thanks to <a href="http://twitter.com/#!/AlbertoFabiano/">@AlbertoFabiano</a>, que postou o linque para sua palestra), que fez uma <a href="http://www.slideshare.net/techberto/root">breve apresentação do ROOT</a>, um framework de análise de dados usados pelos físicos e que poderia ser utilizado facilmente pela comunidade C++. Fiquei particularmente interessado no exemplo de análise do histórico Bovespa e o pontencial da biblioteca. Também foi muito bem-vinda a presença de um físico em um grupo muitas vezes acusado de xiita.</p>
<p><a href="http://www.caloni.com.br/blog/wp-content/uploads/bscap0019.jpg"><img class="aligncenter size-full wp-image-1165" title="bscap0019" src="http://www.caloni.com.br/blog/wp-content/uploads/bscap0019.jpg" alt="" width="430" height="322" /></a></p>
<p>E por falar em xiita, vejam só: uma série inédita de palestras sem nenhuma estar falando especificadamente sobre Windows. O que acham?</p>
<p><a href="http://www.caloni.com.br/blog/wp-content/uploads/bscap0013.jpg"><img class="aligncenter size-full wp-image-1166" title="bscap0013" src="http://www.caloni.com.br/blog/wp-content/uploads/bscap0013.jpg" alt="" width="430" height="322" /></a></p>
<p>Como bônus, dessa vez tivemos nossas palestras filmadas. Apenas peço paciência para a fase de edição, onde devo utilizar os slides dos palestrantes para tornar o visual mais didátivo do que uma câmera se movendo freneticamente de um lado para o outro. Algumas partes podem ter ficado de fora por alguns problemas técnicos (sou marinheiro de primeira viagem), mas o mais importante, com certeza, está gravado.</p>
<p><a href="http://www.caloni.com.br/blog/wp-content/uploads/bscap0022.jpg"><img class="aligncenter size-full wp-image-1167" title="bscap0022" src="http://www.caloni.com.br/blog/wp-content/uploads/bscap0022.jpg" alt="" width="430" height="322" /></a></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/caloni/blog?a=IWw5Ob6PXdE:bPR1lQv8FK4:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/caloni/blog?i=IWw5Ob6PXdE:bPR1lQv8FK4:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/caloni/blog/~4/IWw5Ob6PXdE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.caloni.com.br/blog/archives/oitavo-encontro-do-grupo-cc-brasil/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://www.caloni.com.br/blog/archives/oitavo-encontro-do-grupo-cc-brasil</feedburner:origLink></item>
		<item>
		<title>Depuração de emergência</title>
		<link>http://feedproxy.google.com/~r/caloni/blog/~3/Zk2o8hBjkSA/depuracao-de-emergencia</link>
		<comments>http://www.caloni.com.br/blog/archives/depuracao-de-emergencia#comments</comments>
		<pubDate>Tue, 26 Jul 2011 13:12:29 +0000</pubDate>
		<dc:creator>Wanderley Caloni</dc:creator>
				<category><![CDATA[Depuração]]></category>
		<category><![CDATA[windbg]]></category>

		<guid isPermaLink="false">http://www.caloni.com.br/blog/?p=1139</guid>
		<description><![CDATA[O programa está rodando no servidor do cliente, que é acessível por sessão remota do Windows, mas de repente ele capota. Existem aí duas possibilidades fora o debug remoto (que, nesse caso, não é possível):

Analisar um dump gerado.
Depurar localmente o problema.


Analisar um dump gerado
Para a  [...]]]></description>
			<content:encoded><![CDATA[<p>O programa está rodando no servidor do cliente, que é acessível por sessão remota do Windows, mas de repente ele capota. Existem aí duas possibilidades fora o debug remoto (que, nesse caso, não é possível):</p>
<ol>
<li>Analisar um dump gerado.</li>
<li>Depurar localmente o problema.</li>
</ol>
<p><a href="http://www.caloni.com.br/blog/wp-content/uploads/CrashOnServerCrash.png"><img class="aligncenter size-full wp-image-1140" title="CrashOnServerCrash" src="http://www.caloni.com.br/blog/wp-content/uploads/CrashOnServerCrash.png" alt="" width="678" height="342" /></a></p>
<h3>Analisar um dump gerado</h3>
<p>Para a primeira opção, basta abrir o Gerenciador de Tarefas, localizar o processo e gerar o dump através do menu de contexto.</p>
<p><a href="http://www.caloni.com.br/blog/wp-content/uploads/GenerateCrashDumpTaskManager.png"><img class="aligncenter size-full wp-image-1141" title="GenerateCrashDumpTaskManager" src="http://www.caloni.com.br/blog/wp-content/uploads/GenerateCrashDumpTaskManager.png" alt="" width="713" height="442" /></a></p>
<p>Com o dump e o Windbg em mãos, basta analisá-lo. Porém, se o seu processo é 32 bits e o servidor é 64 bits (geralmente é), o dump gerado será de 64 bits, EMBORA seja de um process 32. Ou seja, ao abri-lo, o sistema vai mostrar as threads de manipulação do SO para sistemas 32 (todos com o nosso amigo wow64cpu).</p>
<pre>Microsoft (R) Windows Debugger Version 6.12.0002.633 AMD64
 Copyright (c) Microsoft Corporation. All rights reserved.</pre>
<pre>Loading Dump File [C:\Tests\CrashOnServer.DMP]
 User Mini Dump File with Full Memory: Only application data is available</pre>
<pre>Executable search path is:
 Windows 7 Version 7600 MP (2 procs) <span style="color: #ff0000;">Free x64</span>
 Product: WinNt, suite: SingleUserTS
 Machine Name:
 Debug session time: Tue Jul 26 09:26:23.000 2011 (UTC - 3:00)
 System Uptime: 0 days 0:35:47.425
 Process Uptime: 0 days 0:00:42.000
 ...........WARNING: MSVCR100D overlaps MSVCP100D</pre>
<pre>*** ERROR: Symbol file could not be found. Defaulted to export symbols for ntdll.dll -
 *** ERROR: Symbol file could not be found. Defaulted to export symbols for wow64cpu.dll -
 wow64cpu!TurboDispatchJumpAddressEnd+0x690:
 00000000`745d2dd9 c3 ret
 0:000&gt; kv
 Child-SP RetAddr : Args to Child : Call Site
 00000000`001ce6c8 00000000`745d282c :  : wow64cpu!TurboDispatchJumpAddressEnd+0x690
 *** ERROR: Symbol file could not be found. Defaulted to export symbols for wow64.dll -
 00000000`001ce6d0 00000000`7464d07e :  : wow64cpu!TurboDispatchJumpAddressEnd+0xe3
 00000000`001ce790 00000000`7464c549 :  : wow64!Wow64SystemServiceEx+0x1ce
 00000000`001ce7e0 00000000`76deae27 :  : wow64!Wow64LdrpInitialize+0x429
 00000000`001ced30 00000000`76de72f8 :  : ntdll!LdrGetKnownDllSectionHandle+0x1a7
 00000000`001cf230 00000000`76dd2ace :  : ntdll!RtlInitCodePageTable+0xe8
 00000000`001cf2a0 00000000`00000000 : : ntdll!LdrInitializeThunk+0xe</pre>
<pre>Para entrar dentro do Inception, é necessário usar a extensão wow64exts e usar o comando ".effmach x86".</pre>
<pre>0:000&gt; .load wow64exts
 0:000&gt; .effmach x86
 Effective machine: x86 compatible (x86)
 0:000:x86&gt; kv
 ChildEBP RetAddr Args to Child
 ..
 ..
 ..
 0035ec98 0035ecac 0035ecfc 0035ecac 0035ecfc ntdll_76f80000!KiUserExceptionDispatcher+0xf (FPO: [2,0,0])
 *** WARNING: Unable to verify checksum for CrashOnServer.exe
 WARNING: Frame IP not in any known module. Following frames may be wrong.
 0035f0bc 01181ca9 0035f198 0035f19c 00000000 0x35ecac
 0035f190 01181b7d 009d80a0 5fb4d717 00000000 CrashOnServer!Log::LogError+0x29
 0035fb08 01186f1f 00000001 009d1410 009d1c68 CrashOnServer!main+0x12d
 0035fb58 01186d4f 0035fb6c 76543677 7efde000 CrashOnServer!__tmainCRTStartup+0x1bf
 0035fb60 76543677 7efde000 0035fbac 76fb9f02 CrashOnServer!mainCRTStartup+0xf
 0035fb6c 76fb9f02 7efde000 771dc110 00000000 kernel32!BaseThreadInitThunk+0xe
 0035fbac 76fb9ed5 01181316 7efde000 00000000 ntdll_76f80000!__RtlUserThreadStart+0x70
 0035fbc4 00000000 01181316 7efde000 00000000 ntdll_76f80000!_RtlUserThreadStart+0x1b</pre>
<p>Após esse último passo, siga para o último passo desse tutorial. Ou escolha a segunda opção:</p>
<h3>Depurar localmente o problema</h3>
<p>Para depurar localmente, supondo que seja um executável simples, você precisa dos seguintes itens:</p>
<ul>
<li>Pasta do WinDbg copiado (a Debugging Tools instalada pelo SDK, ou sua pastinha particular guardada no PenDrive).</li>
<li>Símbolos dos binários envolvidos (em sincronia com os binários que iremos analisar).</li>
<li>Fontes da compilação dos binários (a versão exata seria ideal; grave o revno do controle de fonte pra facilitar).</li>
</ul>
<p>Os fontes, no caso de uma conexão por Terminal Server, podem ser disponibilizados através do mapeamento de drives entre as máquinas. Os símbolos, no entanto, por serem usados extensivamente pelo WinDbg, é recomendável que estejam locais na máquina depurada, pois do contrário você terá que tomar uma quantidade excessiva de cafés para executar meia-dúzia de instruções.</p>
<p>Supondo que temos tudo isso, só precisamos executar alguns passos básicos para o setup:</p>
<h4>1. Abrir o WinDbg e escolher File, Open Executable. Escolha o executável e pare por aí.</h4>
<p><a href="http://www.caloni.com.br/blog/wp-content/uploads/OpeningWinDbgOpenExecutable.png"><img class="aligncenter size-full wp-image-1142" title="OpeningWinDbgOpenExecutable" src="http://www.caloni.com.br/blog/wp-content/uploads/OpeningWinDbgOpenExecutable.png" alt="" width="524" height="352" /></a></p>
<h4><span class="Apple-style-span" style="font-family: Consolas, Monaco, monospace; font-size: 12px; font-weight: bold; line-height: 18px; white-space: pre;">2. Na tela de comando do WinDbg (View, Command, ou Alt + 1) execute os comandos abaixo:</span></h4>
<pre><span class="Apple-style-span" style="font-family: Consolas, Monaco, monospace; font-size: 12px; line-height: 18px; white-space: pre;">.symfix
.sympath+
.reload
</span><span class="Apple-style-span" style="font-family: Consolas, Monaco, monospace; font-size: 12px; line-height: 18px; white-space: pre;">.srcpath
</span><span class="Apple-style-span" style="font-family: Consolas, Monaco, monospace; font-size: 12px; line-height: 18px; white-space: pre;">.reload /f CrashOnServer.exe</span></pre>
<h4><span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif; font-size: 13px; line-height: 19px; white-space: normal;"><span class="Apple-style-span" style="font-family: Consolas, Monaco, monospace; font-size: 12px; line-height: 18px; white-space: pre;">3. A</span>o executar lm, o módulo cujo símbolo foi carregado deve conter o nome do pdb logo à frente.</span></h4>
<pre>0:000&gt; .symfix c:\tools\symbols
 0:000&gt; .sympath+ C:\Projetos\Caloni\Posts\Debug
 Symbol search path is: srv*;C:\Projetos\Caloni\Posts\Debug
 Expanded Symbol search path is: SRV*c:\tools\symbols*http://msdl.microsoft.com/download/symbols;c:\projetos\caloni\posts\debug
 0:000&gt; .reload
 Reloading current modules
 ......
 0:000&gt; .srcpath C:\Projetos\Caloni\Posts
 Source search path is: C:\Projetos\Caloni\Posts
 0:000&gt; .reload /f CrashOnServer.exe
 *** WARNING: Unable to verify checksum for CrashOnServer.exe
 0:000&gt; lm
 start end module name
 00000000`01170000 00000000`01193000 CrashOnServer C (private pdb symbols) C:\Projetos\Caloni\Posts\Debug\CrashOnServer.pdb
 00000000`745d0000 00000000`745d8000 wow64cpu (deferred)
 00000000`745e0000 00000000`7463c000 wow64win (deferred)
 00000000`74640000 00000000`7467f000 wow64 (deferred)
 00000000`76da0000 00000000`76f4c000 ntdll (pdb symbols) c:\tools\symbols\ntdll.pdb\\ntdll.pdb
 00000000`76f80000 00000000`77100000 ntdll32 (deferred)</pre>
<h4>4. Feito isso, está tudo OK. Podemos colocar breakpoints, monitorar variáveis, verificar stacks, etc.</h4>
<p>Por último, execute o seguinte comando na tela de comandos do WinDbg:</p>
<pre>.hh</pre>
<p>E boa sorte =)</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/caloni/blog?a=Zk2o8hBjkSA:riOA75XD-ZM:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/caloni/blog?i=Zk2o8hBjkSA:riOA75XD-ZM:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/caloni/blog/~4/Zk2o8hBjkSA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.caloni.com.br/blog/archives/depuracao-de-emergencia/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.caloni.com.br/blog/archives/depuracao-de-emergencia</feedburner:origLink></item>
		<item>
		<title>Cuidado com variáveis temporárias</title>
		<link>http://feedproxy.google.com/~r/caloni/blog/~3/n6YDUSZ_GCQ/cuidado-com-variaveis-temporarias</link>
		<comments>http://www.caloni.com.br/blog/archives/cuidado-com-variaveis-temporarias#comments</comments>
		<pubDate>Tue, 26 Jul 2011 02:05:14 +0000</pubDate>
		<dc:creator>Wanderley Caloni</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[tips-and-tricks]]></category>

		<guid isPermaLink="false">http://www.caloni.com.br/blog/?p=1131</guid>
		<description><![CDATA[

Um dos problemas que a linguagem C++ possui para seus iniciantes é o de não deixar muito explícito partes do seu comportamento, principalmente as partes que lidam com ponteiros/referências e o jogo da vida dos objetos. Às  vezes a coisa fica de tal como complexa que fica até difícil explicar o  [...]]]></description>
			<content:encoded><![CDATA[

<p>Um dos problemas que a linguagem C++ possui para seus iniciantes é o de não deixar muito explícito partes do seu comportamento, principalmente as partes que lidam com ponteiros/referências e o jogo da vida dos objetos. Às  vezes a coisa fica de tal como complexa que fica até difícil explicar o porquê das coisas.</p>
<p>Por exemplo, vejamos o singelo caso de alguém que precisa formatar uma saída de erro e para isso escolheu um stringstream:</p>
<p><pre><span style="color: #006600;">#include &lt;sstream&gt;</span>
<span style="color: #006600;">#include &lt;exception&gt;</span>
<span style="color: #006600;">#include &lt;iostream&gt;</span>
&nbsp;
<span style="color: #0000ff;">using</span> <span style="color: #0000ff;">namespace</span> std;
&nbsp;
<span style="color: #0000ff;">void</span> LogError<span style="color: #000000; font-weight: bold;">&#40;</span><span style="color: #0000ff;">const</span> <span style="color: #0000ff;">char</span>* msg<span style="color: #000000; font-weight: bold;">&#41;</span>
<span style="color: #000000; font-weight: bold;">&#123;</span>
    <span style="color: #0000ff;">cerr</span> &lt;&lt; <span style="color: #666666;">"** "</span> &lt;&lt; msg &lt;&lt; endl;
<span style="color: #000000; font-weight: bold;">&#125;</span>
&nbsp;
&nbsp;
<span style="color: #0000ff;">void</span> func<span style="color: #000000; font-weight: bold;">&#40;</span><span style="color: #000000; font-weight: bold;">&#41;</span>
<span style="color: #000000; font-weight: bold;">&#123;</span>
    <span style="color: #006600;">//doSomething();</span>
    throw exception<span style="color: #000000; font-weight: bold;">&#40;</span><span style="color: #666666;">"sbrubles exception"</span><span style="color: #000000; font-weight: bold;">&#41;</span>;
<span style="color: #000000; font-weight: bold;">&#125;</span>
&nbsp;
&nbsp;
<span style="color: #0000ff;">int</span> main<span style="color: #000000; font-weight: bold;">&#40;</span><span style="color: #000000; font-weight: bold;">&#41;</span>
<span style="color: #000000; font-weight: bold;">&#123;</span>
    <span style="color: #0000ff;">try</span>
    <span style="color: #000000; font-weight: bold;">&#123;</span>
        func<span style="color: #000000; font-weight: bold;">&#40;</span><span style="color: #000000; font-weight: bold;">&#41;</span>;
    <span style="color: #000000; font-weight: bold;">&#125;</span>
    <span style="color: #0000ff;">catch</span><span style="color: #000000; font-weight: bold;">&#40;</span>exception&amp; e<span style="color: #000000; font-weight: bold;">&#41;</span>
    <span style="color: #000000; font-weight: bold;">&#123;</span>
        stringstream ss;
        ss &lt;&lt; <span style="color: #666666;">"Error calling func: "</span> &lt;&lt; e.<span style="color: #000000;">what</span><span style="color: #000000; font-weight: bold;">&#40;</span><span style="color: #000000; font-weight: bold;">&#41;</span> &lt;&lt; endl;
        <span style="color: #0000ff;">const</span> <span style="color: #0000ff;">char</span>* errorMessage = ss.<span style="color: #000000;">str</span><span style="color: #000000; font-weight: bold;">&#40;</span><span style="color: #000000; font-weight: bold;">&#41;</span>.<span style="color: #000000;">c_str</span><span style="color: #000000; font-weight: bold;">&#40;</span><span style="color: #000000; font-weight: bold;">&#41;</span>;
        LogError<span style="color: #000000; font-weight: bold;">&#40;</span>errorMessage<span style="color: #000000; font-weight: bold;">&#41;</span>;
    <span style="color: #000000; font-weight: bold;">&#125;</span>
<span style="color: #000000; font-weight: bold;">&#125;</span></pre></p>
<p>Quando chamamos func, ele lança uma exceção que é capturada no main que, por sua vez, formata uma stream e obtém sua string (através do método str) e através dessa string obtém o ponteiro da string em C puro (através do método c_str). Porém, a mensagem resultante na saída-padrão de erro não era o esperado:</p>
<p><a href="http://www.caloni.com.br/blog/wp-content/uploads/ExceptionSStreamConsoleOutput.png"><img class="aligncenter size-full wp-image-1133" title="ExceptionSStreamConsoleOutput" src="http://www.caloni.com.br/blog/wp-content/uploads/ExceptionSStreamConsoleOutput.png" alt="" width="677" height="342" /></a></p>
<p>Depurando diretamente, vemos que a stream, de fato, contém o que esperávamos. O único elemento errante é justamente o ponteiro obtido através da chamada dupla de métodos.</p>
<p><a href="http://www.caloni.com.br/blog/wp-content/uploads/ExceptionSStreamDebugWatch.png"><img class="aligncenter size-full wp-image-1134" title="ExceptionSStreamDebugWatch" src="http://www.caloni.com.br/blog/wp-content/uploads/ExceptionSStreamDebugWatch.png" alt="" width="791" height="403" /></a></p>
<p>O porquê isso ocorre só fica óbvio quando vemos <a title="Ajuda da função stringstream::str" href="http://www.cplusplus.com/reference/iostream/stringstream/str/">a ajuda</a> (ou a assinatura) da função str da classe stringstream:</p>
<blockquote>
<pre><strong><span style="color: #ff0000;">string str ( ) const;</span></strong>
<strong>void str ( const string &amp; s );</strong>

<strong>Get/set the associated string object</strong></pre>
<pre><strong>The first version <span style="text-decoration: underline; color: #ff0000;">returns a copy of the string object</span> currently associated with the string stream buffer.</strong></pre>
</blockquote>
<p>Ora, a função str retorna uma <strong>cópia</strong> do objeto string usado internamento pelo buffer de nossa string stream. Duas coisas ocorrem em qualquer cópia de um objeto retornada por uma função:</p>
<ul>
<li>A cópia do objeto original e seu desacoplamento (óbvio).</li>
<li>A construção de um objeto baseado no original e que, após o fim da expressão onde foi chamado o método, <strong>é destruído</strong>.</li>
</ul>
<p>Uma vez que a chamada a str termina, é entregue uma instância de uma string que contém a string original que está sendo usada pela string stream para a expressão da chamada, que geralmente vem seguida de uma cópia:</p>
<pre>//
// 1. str retorna uma cópia;
// 2. atribuição copia retorno para buf.
//
string buf = ss.str();</pre>
<pre></pre>
<p>A variável buf no exemplo acima será, portanto, a terceira string usada aqui até então. Ao final da expressão, a string intermediária retornada por str é automaticamente destruída, por se trata de uma cópia temporária para obedecer a sintaxe de retorno da função.</p>
<p>Agora, o que acontece se, <strong>na cópia temporária</strong>, é feita uma operação para obter seu ponteiro interno usado para armazenar sua string estilo C?</p>
<p>Obviamente ele fica inválido após o fim da expressão!</p>
<p>Vamos ver em câmera lenta:</p>
<p><a href="http://www.caloni.com.br/blog/wp-content/uploads/ExceptionSStreamDebugWatch2.png"><img class="aligncenter size-full wp-image-1135" title="ExceptionSStreamDebugWatch2" src="http://www.caloni.com.br/blog/wp-content/uploads/ExceptionSStreamDebugWatch2.png" alt="" width="798" height="391" /></a></p>
<p>Nada como assembly fresquinho para refrescar os conceitos de C++ por baixo dos panos.</p>
<h3>Update</h3>
<p>Após uma enxurrada de programadores gerenciáveis perguntarem qual seria, então, a solução ideal, segue o snipet mais explicitado:</p>
<pre>// 1. Copie a string retornada para uma variável não-temporária
string buf = message.str();

// 2. Use essa string dentro de seu escopo válido (até o final do catch, no exemplo do artigo).
const char* text = buf.c_str();</pre>
<h3>Update 2</h3>
<p>Outro leitor sugeriu fazer toda a chamada em uma única instrução, economizando em expressividade e ainda evitando a destruição da variável temporária criada ao chamar str.</p>
<pre>// 1. Matar três coelhos com uma instrução só.
LogError(ss.str().c_str());</pre>
<p>Particularmente, gosto de instruções simples que me permitam ver claramente o que está acontecendo de forma simples pelo depurador (até porque sei que o compilador irá otimizar tudo no final em versão Release, ainda mais se estiver quebrado em instruções simples). Porém, toda solução que evita o uso da variável temporária após a execução do método str é válida.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/caloni/blog?a=n6YDUSZ_GCQ:j1SZu18r5lA:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/caloni/blog?i=n6YDUSZ_GCQ:j1SZu18r5lA:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/caloni/blog/~4/n6YDUSZ_GCQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.caloni.com.br/blog/archives/cuidado-com-variaveis-temporarias/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://www.caloni.com.br/blog/archives/cuidado-com-variaveis-temporarias</feedburner:origLink></item>
		<item>
		<title>E foi-se o TDC</title>
		<link>http://feedproxy.google.com/~r/caloni/blog/~3/sU_n86ADdlM/e-foi-se-o-tdc</link>
		<comments>http://www.caloni.com.br/blog/archives/e-foi-se-o-tdc#comments</comments>
		<pubDate>Thu, 07 Jul 2011 17:15:05 +0000</pubDate>
		<dc:creator>Wanderley Caloni</dc:creator>
				<category><![CDATA[Blogging]]></category>
		<category><![CDATA[eventos]]></category>
		<category><![CDATA[palestras]]></category>

		<guid isPermaLink="false">http://www.caloni.com.br/blog/?p=1126</guid>
		<description><![CDATA[Dessa vez, talvez pelo dia de semana, havia poucos participantes. Isso, contudo, não evitou que o conteúdo e a qualidade das palestras fosse, como sempre, de alto nível.
Infelizmente, só cheguei a partir da palestra de Antonio Ribeiro sobre uma Simulação Distribuída focando no trânsito de São  [...]]]></description>
			<content:encoded><![CDATA[<p>Dessa vez, talvez pelo dia de semana, havia poucos participantes. Isso, contudo, não evitou que o conteúdo e a qualidade das palestras fosse, como sempre, de alto nível.</p>
<p>Infelizmente, só cheguei a partir da palestra de Antonio Ribeiro sobre uma Simulação Distribuída focando no trânsito de São Paulo. Há tempos esse é um tema debatido e ainda acredito que a tecnologia ainda vai resolver isso da melhor maneira possível: cada um em sua casa.</p>
<p>Depois do agradável almoço, onde tive a oportunidade de rever <a href="http://dqsoft.blogspot.com">DQSoft </a>e conversar sobre leituras de ficção-não-necessariamente-científica, participamos de um pequeno review sobre escrita de código seguro. Ao menos não tivemos que ouvir novamente algum representante da Microsoft falando sobre a famigerada lib que refazia as funções do C para a versão com copyright_s.</p>
<p>Então chega a vez da palestra mais bagunçada: a minha. Juro que perdi totalmente o fio da meada no início, e quanto mais me esforçava para lembrar o que devia ser dito, mais esquecia. Então resolvi partir direto para o <em>hands-on</em>, onde consegui, imagino eu, com um ritmo adequado, demonstrar todo o cenário da análise do Dicionário Houaiss que tinha feito anos atrás. E pelo visto, muitas pessoas gostaram, pois fui abordado por três ou quatro participantes muito simpáticos e entusiasmados com o tema. Talvez seja hora de voltar para esse submundo mais um pouquinho, fazer coisas mais <em>hardcore </em>pra variar...</p>
<p>Depois do <em>coffee</em>-açucarado-<em>break</em>, tivemos a palestra mais interessante do dia: desenvolvimento de <em>microkernels</em>, apresentado por <a href="http://twitter.com/#!/rmaalmeida/">Rodrigo Almeida</a>, professor de Eletrônica e Programação de Embarcados da Unifei. Não só o tema me interessou ao máximo, como a didática da apresentação foi impecável, abordando tanto os pontos for-dummies quanto um gostinho do que seria fazer por nós mesmos um controle intermediário entre a placa e os programas.</p>
<p>Ao final, nosso mestre-de-cerimônias habitual Alberto <a href="http://techberto.wordpress.com/">Techberto</a> Fabiano fez a abertura de um painel tentando mesclar problemas + experiência + vontade de aprender. Dos assuntos que me lembro, chamou a atenção o fato dos profissionais da linguagem (C/C++) estarem escasseando cada vez mais e também o fato de nosso Grupo C/C++ parecer praticamente invisível aos olhos do Google, pois parece que quase ninguém consegue encontrar o dito cujo.</p>
<p>Infelizmente, alguns compromissos inadiáveis me fizeram ter que sair pela esquerda e esquecer o Lado B da questão. Felizmente, esse não é o nosso último encontro, e espero participar de futuras oportunidades de me integrar à nossa agora, como diz meu amigo <a href="http://twitter.com/#!/andersondsantos/">Pikachu</a>, comunidade maçônica.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/caloni/blog?a=sU_n86ADdlM:uZKUFMkfcbs:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/caloni/blog?i=sU_n86ADdlM:uZKUFMkfcbs:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/caloni/blog/~4/sU_n86ADdlM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.caloni.com.br/blog/archives/e-foi-se-o-tdc/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://www.caloni.com.br/blog/archives/e-foi-se-o-tdc</feedburner:origLink></item>
		<item>
		<title>TDC 2011</title>
		<link>http://feedproxy.google.com/~r/caloni/blog/~3/WF1RvJPETuE/tdc-2011</link>
		<comments>http://www.caloni.com.br/blog/archives/tdc-2011#comments</comments>
		<pubDate>Thu, 30 Jun 2011 02:44:27 +0000</pubDate>
		<dc:creator>Wanderley Caloni</dc:creator>
				<category><![CDATA[Engenharia Reversa]]></category>
		<category><![CDATA[eventos]]></category>
		<category><![CDATA[palestra]]></category>
		<category><![CDATA[tdc]]></category>

		<guid isPermaLink="false">http://www.caloni.com.br/blog/?p=1116</guid>
		<description><![CDATA[ Estarei no TDC esse ano. A trilha é de C++, mas farei uma palestra sobre engenharia reversa. Para ser mais específico, falaremos sobre a análise do Dicionário Houaiss, cujo projeto venho mantendo nos últimos anos. Acho legal termos um espaço para falarmos de quando fazemos realmente a coisa, em  [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.caloni.com.br/blog/wp-content/uploads/barra-top-basic-v3.jpg"><img class="alignleft size-full wp-image-1118" title="barra-top-basic-v3" src="http://www.caloni.com.br/blog/wp-content/uploads/barra-top-basic-v3.jpg" alt="" width="273" height="80" /></a> Estarei no <a href="http://www.thedevelopersconference.com.br/tdc/2011/saopaulo/trilha-ccc#programacao">TDC</a> esse ano. A trilha é de C++, mas farei uma palestra sobre engenharia reversa. Para ser mais específico, falaremos sobre a análise do <a href="http://www.caloni.com.br/blog/archives/conversor-de-houaiss-para-babylon-parte-1">Dicionário Houaiss</a>, cujo projeto venho mantendo nos últimos anos. Acho legal termos um espaço para falarmos de quando fazemos realmente a coisa, em vez de ficar sempre na teoria de como seria ou o que um programador precisa saber para começar a analisar um binário.</p>
<p>Se você gosta do tema e possui dúvidas a respeito, ou gostaria de mais detalhes sobre outros projetos, não deixe de comparecer. Antes e depois da palestra estarei disponível para conversarmos. O mais interessante de termos uma trilha em C++ é reunir pessoas envolvidas em torno da linguagem, não importando muito a área. Somos um grupo pequeno, e é importante que tenhamos um contato mais próximo de vez em quando.</p>
<blockquote><p><strong>C/C++ Caso de Uso: Engenharia Reversa com Windbg</strong></p>
<p>Esta palestra é sobre desmontar e montar novamente. Iremos descobrir como as entradas do dicionário Houaiss eletrônico estão gravadas em um primeiro momento, para depois remontarmos essa informação de maneira que ela possa ser usada em um outro dicionário.</p>
<p><strong>Ferramentas</strong> que serão usadas: Windows, WinDbg, Visual Studio (qualquer versão).</p>
<p><strong>Conhecimentos </strong>necessários: C/C++, Assembly 8086, Win32 API.</p>
<p><strong>Passo-a-passo</strong> da palestra:</p>
<ol>
<li>Sobre Pirataria. Como identificar brechas na licença para que você possa usufruir do seu trabalho de refatoração binária.</li>
<li>Análise. Desmontando o dicionário Houaiss e desvendando seu funcionamento interno.</li>
<li>Programação. Remontando a estrutura identificada pela Engenharia Reversa em um formato aberto.</li>
<li>Sobre Fair Use. Explicando como abrir portas para o desenvolvimento de soluções baseada em nossa análise.</li>
</ol>
</blockquote>
<h3>Outros conteúdos</h3>
<p>Assuntos "similares" também nos esperam com Sergio Prado e programação segura e Rodrigo Almeida, abordando o desenvolvimento de microkernel. Além disso, também teremos Bruno Koga e Guilherme Andrade destrinchando o compilador LLVM para Objective-C, enquanto Antonio Ribeiro Alves Júnior explica sobre t100, um Middleware para Simulação Distribuída.</p>
<p>Nos vemos lá.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/caloni/blog?a=WF1RvJPETuE:F46uKims2XY:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/caloni/blog?i=WF1RvJPETuE:F46uKims2XY:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/caloni/blog/~4/WF1RvJPETuE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.caloni.com.br/blog/archives/tdc-2011/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://www.caloni.com.br/blog/archives/tdc-2011</feedburner:origLink></item>
	</channel>
</rss>

