<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	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/"
	>

<channel>
	<title>Blog do PacMan &#187; strace</title>
	<atom:link href="http://pacman.blog.br/blog/tag/strace/feed/" rel="self" type="application/rss+xml" />
	<link>http://pacman.blog.br/blog</link>
	<description>Varias Coisas, por Tiago Peczenyj</description>
	<lastBuildDate>Thu, 26 Jan 2012 13:51:31 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Ate um simples Hello World pode ser complicado</title>
		<link>http://pacman.blog.br/blog/dicas/ate-um-simples-hello-world-pode-ser-complicado/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=ate-um-simples-hello-world-pode-ser-complicado</link>
		<comments>http://pacman.blog.br/blog/dicas/ate-um-simples-hello-world-pode-ser-complicado/#comments</comments>
		<pubDate>Fri, 27 Feb 2009 22:16:15 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[strace]]></category>

		<guid isPermaLink="false">http://pacman.blog.br/blog/?p=72</guid>
		<description><![CDATA[Para ilustrar a sintaxe de uma linguagem, é comum o primeiro exemplo ser o hello world, no qual o programa realiza um aceno breve e fugaz (valeu zED9h) para o mundo exterior. Vejamos em C: #include &#60;stdio.h&#62; int main (int &#8230; <a href="http://pacman.blog.br/blog/dicas/ate-um-simples-hello-world-pode-ser-complicado/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Para ilustrar a sintaxe de uma linguagem, é comum o primeiro exemplo ser o <em>hello world</em>, no qual o programa realiza um aceno breve e fugaz (valeu zED9h) para o mundo exterior. Vejamos em C:</p>
<p><code><br />
#include &lt;stdio.h&gt;<br />
int main (int argc, const char* argv[]){<br />
printf("hello world!\n");<br />
return 0;<br />
}<br />
</code></p>
<p>Aparentemente é um codigo simples, vamos olhar a execução<br />
<code><br />
peczenyj@XXX:~$ gcc -Wall hello.c -o hello.exe<br />
peczenyj@XXX:~$ ./hello.exe &amp;&amp; echo "ok" || echo "nok"<br />
hello world!<br />
ok</code></p>
<p>Testar um hello world sob condições normais não é dificil: ele vai escrever uma mensagem fixa na stdout e vai retornar 0 para o bash (que pode ser recuperado via $? ou então encadear &amp;&amp; e || como eu fiz no exemplo acima.</p>
<p>Agora vejamos o strace:</p>
<p><code>peczenyj@XXX:~$ strace ./hello.exe<br />
execve("./hello.exe", ["./hello.exe"], [/* 35 vars */]) = 0<br />
brk(0)                                  = 0x804a000<br />
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)<br />
mmap2(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7f9c000<br />
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)<br />
open("/etc/ld.so.cache", O_RDONLY)      = 3<br />
fstat64(3, {st_mode=S_IFREG|0644, st_size=81298, ...}) = 0<br />
mmap2(NULL, 81298, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb7f88000<br />
close(3)                                = 0<br />
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)<br />
open("/lib/tls/i686/cmov/libc.so.6", O_RDONLY) = 3<br />
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\260a\1"..., 512) = 512<br />
fstat64(3, {st_mode=S_IFREG|0644, st_size=1339816, ...}) = 0<br />
mmap2(NULL, 1349136, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xb7e3e000<br />
mmap2(0xb7f82000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x143) = 0xb7f82000<br />
mmap2(0xb7f85000, 9744, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xb7f85000<br />
close(3)                                = 0<br />
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7e3d000<br />
set_thread_area({entry_number:-1 -&gt; 6, base_addr:0xb7e3d6b0, limit:1048575, seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, seg_not_present:0, useable:1}) = 0<br />
mprotect(0xb7f82000, 4096, PROT_READ)   = 0<br />
munmap(0xb7f88000, 81298)               = 0<br />
fstat64(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 2), ...}) = 0<br />
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7f9b000<br />
write(1, "hello world!\n", 13hello world!<br />
)          = 13<br />
exit_group(0)                           = ?<br />
Process 6344 detached<br />
</code></p>
<p>Vejamos só: uma grande preparação para, no final, mostrar um <em>hello world</em> e sair (com sucesso). Isso mostra que qualquer coisa, mesmo a mais simples, esta envolta em muitas camadas de abstração até ser corretamente executada. Aqui estamos ignorando o sistema de arquivos, sistema operacional, memoria, cpu, etc. Com linguagens interpretadas ou que rodam sob uma JVM a coisa é mais complexa ainda.</p>
]]></content:encoded>
			<wfw:commentRss>http://pacman.blog.br/blog/dicas/ate-um-simples-hello-world-pode-ser-complicado/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

