<?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>Vincent Gable's Blog &#187; Reverse Engineering</title>
	<atom:link href="http://vgable.com/blog/category/reverse-engineering/feed/" rel="self" type="application/rss+xml" />
	<link>http://vgable.com/blog</link>
	<description>my weblog.</description>
	<lastBuildDate>Tue, 29 Nov 2011 22:20:23 +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>What Am I About To Call?</title>
		<link>http://vgable.com/blog/2010/04/29/what-am-i-about-to-call/</link>
		<comments>http://vgable.com/blog/2010/04/29/what-am-i-about-to-call/#comments</comments>
		<pubDate>Fri, 30 Apr 2010 02:40:10 +0000</pubDate>
		<dc:creator>Vincent Gable</dc:creator>
				<category><![CDATA[Cocoa]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[MacOSX]]></category>
		<category><![CDATA[Objective-C]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Reverse Engineering]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[Debugging]]></category>
		<category><![CDATA[gdb]]></category>
		<category><![CDATA[x86]]></category>

		<guid isPermaLink="false">http://vgable.com/blog/?p=597</guid>
		<description><![CDATA[Say you&#8217;re in gdb, and about to execute a call instruction for dyld_stub_objc_msgSend, how do you know what&#8217;s about to happen? On i386 (gdb) x/s *(SEL*)($esp+4) tells you the message that&#8217;s about to be sent. (gdb) po *(id*)$esp tells you the target object that&#8217;s about to get the message.]]></description>
			<content:encoded><![CDATA[<p>Say you&#8217;re in gdb, and about to execute a <code>call</code> instruction for <code>dyld_stub_objc_msgSend</code>, how do you know what&#8217;s about to happen?</p>
<h3>On i386</h3>
<pre>(gdb) x/s *(SEL*)($esp+4)</pre>
<p>tells you the <strong>message</strong> that&#8217;s about to be sent.</p>
<pre>(gdb) po *(id*)$esp</pre>
<p>tells you the <strong>target</strong> object that&#8217;s about to get the message.</p>
]]></content:encoded>
			<wfw:commentRss>http://vgable.com/blog/2010/04/29/what-am-i-about-to-call/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>HeyPervertStopLookingAtMyPEF</title>
		<link>http://vgable.com/blog/2009/07/09/heypervertstoplookingatmypef/</link>
		<comments>http://vgable.com/blog/2009/07/09/heypervertstoplookingatmypef/#comments</comments>
		<pubDate>Fri, 10 Jul 2009 02:44:22 +0000</pubDate>
		<dc:creator>Vincent Gable</dc:creator>
				<category><![CDATA[Reverse Engineering]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Games]]></category>
		<category><![CDATA[Joy!peffpwpc]]></category>
		<category><![CDATA[MacsBug]]></category>
		<category><![CDATA[Marathon]]></category>
		<category><![CDATA[Memories]]></category>
		<category><![CDATA[PowerPC]]></category>

		<guid isPermaLink="false">http://vgable.com/blog/?p=347</guid>
		<description><![CDATA[When I was in my early teens, I played a lot of Marathon &#8212; the classic Macintosh first-person shooter by Bungie. There&#8217;s a detail about Marathon &#8734; that I haven&#8217;t seen documented anywhere, but I thought was very cool. If you tried to use MacsBug on a PowerPC machine to inspect (disassemble) M&#8734;, none of [...]]]></description>
			<content:encoded><![CDATA[<p>When I was in my early teens, I played a lot of <a href="http://marathon.bungie.org/"><cite>Marathon</cite></a> &#8212; the classic Macintosh first-person shooter by <a href="http://en.wikipedia.org/wiki/Bungie">Bungie</a>.</p>
<p>There&#8217;s a detail about <cite>Marathon &infin;</cite> that I haven&#8217;t seen documented anywhere, but I thought was very cool.</p>
<p>If you tried to use <a href="http://en.wikipedia.org/wiki/MacsBug">MacsBug</a> on a PowerPC machine to inspect (disassemble) <cite>M&infin;</cite>, none of the functions had names, except for one: <strong><code>HeyPervertStopLookingAtMyPEF</code></strong>.</p>
<p>(PEF stands for <a href="http://en.wikipedia.org/wiki/Preferred_Executable_Format">Preferred Executable Format</a>, the way Mac OS applications stored PowerPC code).</p>
<p>Today, you can still play <a href="http://www.bungie.net/News/content.aspx?type=topnews&#038;cid=12664"><cite>Marathon 2: Durandal</cite> on XBox Live</a> for a price, or <a href="http://source.bungie.org/get/">play any of the trilogy for free on a computer</a>. Sadly though, I don&#8217;t think the game has aged as well as <a href="http://www.ambrosiasw.com/games/evn/">Escape Velocity</a>, which is still a blast today.</p>
]]></content:encoded>
			<wfw:commentRss>http://vgable.com/blog/2009/07/09/heypervertstoplookingatmypef/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Reverse Engineering Inter-Process Communication</title>
		<link>http://vgable.com/blog/2009/02/05/reverse-engineering-inter-process-communication/</link>
		<comments>http://vgable.com/blog/2009/02/05/reverse-engineering-inter-process-communication/#comments</comments>
		<pubDate>Thu, 05 Feb 2009 17:26:32 +0000</pubDate>
		<dc:creator>Vincent Gable</dc:creator>
				<category><![CDATA[Interface Builder]]></category>
		<category><![CDATA[MacOSX]]></category>
		<category><![CDATA[Reverse Engineering]]></category>
		<category><![CDATA[IPC]]></category>
		<category><![CDATA[Xcode]]></category>

		<guid isPermaLink="false">http://vgable.com/blog/2009/02/05/reverse-engineering-inter-process-communication/</guid>
		<description><![CDATA[Matt Gallagher tells how he reverse engineered the link between Xcode and Interface Builder. Very interesting, I learned a lot. I&#8217;ve done essentially the same thing with iChat. (And in retrospect it might have been a bad idea, because it&#8217;s broken on Snow Leopard).]]></description>
			<content:encoded><![CDATA[<p><a href="http://cocoawithlove.com/2009/02/interprocess-communication-snooping.html">Matt Gallagher tells how he reverse engineered the link between Xcode and Interface Builder</a>.  Very interesting, I learned a lot.  I&#8217;ve <a href="http://imlocation.wordpress.com/2007/11/01/interfacing-with-hacking-ichat-in-leopard/">done essentially the same thing with iChat.</a>  (And in retrospect it might have been a bad idea, because it&#8217;s broken on Snow Leopard).</p>
]]></content:encoded>
			<wfw:commentRss>http://vgable.com/blog/2009/02/05/reverse-engineering-inter-process-communication/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Undocumented Automator.framework Goodness: Actions Library</title>
		<link>http://vgable.com/blog/2008/12/19/undocumented-automatorframework-goodness-actions-library/</link>
		<comments>http://vgable.com/blog/2008/12/19/undocumented-automatorframework-goodness-actions-library/#comments</comments>
		<pubDate>Fri, 19 Dec 2008 20:51:56 +0000</pubDate>
		<dc:creator>Vincent Gable</dc:creator>
				<category><![CDATA[Cocoa]]></category>
		<category><![CDATA[Interface Builder]]></category>
		<category><![CDATA[MacOSX]]></category>
		<category><![CDATA[Objective-C]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Reverse Engineering]]></category>
		<category><![CDATA[AMLibraryPanel]]></category>
		<category><![CDATA[AMLibraryView]]></category>
		<category><![CDATA[AMWorkflowController]]></category>
		<category><![CDATA[AMWorkflowView]]></category>
		<category><![CDATA[Automator]]></category>
		<category><![CDATA[Bad Idea?]]></category>

		<guid isPermaLink="false">http://vgable.com/blog/2008/12/19/undocumented-automatorframework-goodness-actions-library/</guid>
		<description><![CDATA[In Leopard, Apple introduced AMWorkflowView and AMWorkflowController, which let you easily add automator-editing capabilities to your application (modulo bugs!) Obviously, for editing a workflow to be useful, you need to be able to add actions to it. And to do that, you need to be able to browse and search actions. But the current Automator.framework [...]]]></description>
			<content:encoded><![CDATA[<p>In Leopard, Apple introduced <a href="http://developer.apple.com/DOCUMENTATION/AppleApplications/Reference/AMWorkflowView_Class/Reference/Introduction.html"><code>AMWorkflowView</code></a> and <a href="http://developer.apple.com/DOCUMENTATION/AppleApplications/Reference/AMWorkflowController_class/index.html"><code>AMWorkflowController</code></a>, which let you easily add automator-editing capabilities to your application (modulo <a href="http://vgable.com/blog/2008/12/18/automator-bugs/">bugs!</a>)</p>
<p>Obviously, for editing a workflow to be useful, you need to be able to add actions to it.  And to do that, you need to be able to browse and search actions.  But the current Automator.framework has no official support for doing this.</p>
<p>But there are undocumented private APIs, which <a href="file://localhost/Applications/Automator.app/">Automator.app (link launches it)</a> uses&#8230;</p>
<h3>How to Find Them</h3>
<p><a href="http://www.codethecode.com/projects/class-dump/">class-dump</a> is an amazingly useful command-line tool that lets you generate headers from a compiled Objective-C binary.  Download it, and point it at <code>/System/Library/Frameworks/Automator.framework/Automator</code>, to see everything Automator.framework <em>really</em> lets you do.</p>
<h3>Instant Library Panel</h3>
<p>The most useful definition I found was,<br />
<code>@interface NSApplication (AMLibraryPanel)<br />
- (void)orderFrontAutomatorLibraryPanel:(id)sender;<br />
@end<br /></code></p>
<p><strong>Calling <code>[NSApp orderFrontAutomatorLibraryPanel:nil];</code> will show a panel with the same action-library view Automator has.<br />
</strong></p>
<p>This is what I&#8217;m using right now in <a href="http://vincentgable.com/imlocation/">IMLocation</a> to let people find actions for workflows.  I don&#8217;t like the idea of using private APIs.  But I like the idea of implementing my own <code>AMLibraryView</code> replacement even less.  It would be a <em>lot</em> of work to make it as good as the real thing.  Any differences give users a fractured experience &#8212; one way to do something in Automator, another in my program.  And I would get dismal ROI, because I expect Apple to expose this functionality in the (near) future.</p>
<p>(I also wouldn&#8217;t be so bullish on using private APIs if I didn&#8217;t have workarounds in place right now.  The only way <code>orderFrontAutomatorLibraryPanel:</code> gets called is if a user presses a &#8220;Show Actions&#8221; button on the toolbar.  That same toolbar has an &#8220;Open in Automator&#8221; button that opens the worklfow in Automator, where they can edit it without bugs.  So even if <code>orderFrontAutomatorLibraryPanel:</code> stopped working tomorrow, users could still do everything they could before &#8212; albeit less elegantly).</p>
<h3>Looking Just Like Automator</h3>
<p><strong>I don&#8217;t recommend doing this</strong>, but I&#8217;ve been able to embed an <code>AMLibraryView</code> in an <code>NSSplitView</code> next to an <code>AMWorkflowView</code>, to get a more Automator.app-like appearance.</p>
<p>Here&#8217;s how I did it, given the <code>IBOutlet</code>s <code>workflowViewAndLibrarySplitView</code> which is an <code>NSSplit</code> view with an <code>AMWorkflowView</code> in one side, and the other side&#8217;s view connected to the outlet <code>workflowLibraryView</code>,</p>
<p><code>[workflowViewAndLibrarySplitView replaceSubview:workflowLibraryView with:[[AMLibraryPanel sharedLibraryPanel] _libraryView]];</code></p>
<p>Will put the library view inside your split view.</p>
<p>Of course this screws up <code>orderFrontAutomatorLibraryPanel:</code>.  And I would not expect it to work in two windows.  And it&#8217;s using an underscore-private method of an already private and undocumented API.  That&#8217;s just to too risky for me; so I stick with the panel.  It gets the job done with one line of code, and that&#8217;s good enough for me.</p>
]]></content:encoded>
			<wfw:commentRss>http://vgable.com/blog/2008/12/19/undocumented-automatorframework-goodness-actions-library/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Bug In The Machine</title>
		<link>http://vgable.com/blog/2008/12/02/bug-in-the-machine/</link>
		<comments>http://vgable.com/blog/2008/12/02/bug-in-the-machine/#comments</comments>
		<pubDate>Wed, 03 Dec 2008 02:43:28 +0000</pubDate>
		<dc:creator>Vincent Gable</dc:creator>
				<category><![CDATA[Announcement]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Reverse Engineering]]></category>
		<category><![CDATA[Bugs]]></category>
		<category><![CDATA[Cosmic Coincidence]]></category>
		<category><![CDATA[Debugging]]></category>
		<category><![CDATA[Very Cool]]></category>

		<guid isPermaLink="false">http://vgable.com/blog/2008/12/02/bug-in-the-machine/</guid>
		<description><![CDATA[I was going through some old (OS 9 old at youngest!) backups, and found this dump from a MacsBug session. You can actually see a bug sitting in memory! To me it looks like the bug is inside an old television, with distortion sweeping across the screen, so some of the bug&#8217;s left side is [...]]]></description>
			<content:encoded><![CDATA[<p>I was going through some old (<a href="http://en.wikipedia.org/wiki/Mac_OS_9">OS 9</a> old at youngest!) backups, and found this dump from a <a href="http://developer.apple.com/tools/debuggers/MacsBug/">MacsBug</a> session.  <strong>You can actually see a bug sitting in memory</strong>!  To me it looks like the bug is inside an old television, with distortion sweeping across the screen, so some of the bug&#8217;s left side is wrapped around to the right.</p>
<p><code>&nbsp;Displaying&nbsp;memory&nbsp;from&nbsp;1D9F8CB0<br />&nbsp;&nbsp;1D9F8CB0&nbsp;&nbsp;•???•???•???•???•???•???•???•???•???•???•???•???•???•???•???•???<br />&nbsp;&nbsp;1D9F8CF0&nbsp;&nbsp;•???•???•???•???•???•???•???•???•???•???•???•???•???•???•???•???<br />&nbsp;&nbsp;1D9F8D30&nbsp;&nbsp;•???•???•???•???•???•???•???•???•???•???•???•???•???•???•???•???<br />&nbsp;&nbsp;1D9F8D70&nbsp;&nbsp;•???•???•???•???•üÖ`´••••••P•••Ñ•y•pÄ@•••••Ä•@•••••••••H•••H••••<br />&nbsp;&nbsp;1D9F8DB0&nbsp;&nbsp;•••••••••••É9ÿ•••••••••••••••••••üçÄ´•••••&nbsp;•••‚&nbsp;0000000000000000<br />&nbsp;&nbsp;1D9F8DF0&nbsp;&nbsp;0000000000000000000000000000000000000000000000000000000000000000<br />&nbsp;&nbsp;1D9F8E30&nbsp;&nbsp;0000000000000000000000000000000000000000000000000000000000000000<br />&nbsp;&nbsp;1D9F8E70&nbsp;&nbsp;0000000000000000000000000000000000000000000000000000000000000000<br />&nbsp;&nbsp;1D9F8EB0&nbsp;&nbsp;0000000000000000000000000000000000000000000000000000000000000000<br />&nbsp;&nbsp;1D9F8EF0&nbsp;&nbsp;0000000000000000000000000000000000000000000000000000000000000000<br />&nbsp;&nbsp;1D9F8F30&nbsp;&nbsp;0000000000000000000000000000000000000000000000000000000000000000<br />&nbsp;&nbsp;1D9F8F70&nbsp;&nbsp;0000000000000000000000000000000000000000000000000000000%***$*#**<br />&nbsp;&nbsp;1D9F8FB0&nbsp;&nbsp;#*$$*$*#*#**$$*00*$*$*$$**#*#*#*#*#*#**#%00000000000000*•!#•!!!!<br />&nbsp;&nbsp;1D9F8FF0&nbsp;&nbsp;!!!•!!!!!!!!!!!0%!!!!#!!!!!!!!!!!!!!!!!!*00000000000000*!"!•!!!!<br />&nbsp;&nbsp;1D9F9030&nbsp;&nbsp;!!••!!!!!!!!!!!0.!!••!!!!!!!!!!•!•!!•!!!#00000000000000*!!!(•!!!<br />&nbsp;&nbsp;1D9F9070&nbsp;&nbsp;!!!(•!!!!!!!!!!0%!!((!!!!!!!!•!!!!!!!!!!*00000000000000#!!!&nbsp;••!&nbsp;<br />&nbsp;&nbsp;1D9F90B0&nbsp;&nbsp;•••••••••••••••0*••!•••••••••••••••••••••00000000000000*!!!•••00<br />&nbsp;&nbsp;1D9F90F0&nbsp;&nbsp;•••••••••••••••0#••!•••••••••••!00•••••••00000000000000#!!!••#0/<br />&nbsp;&nbsp;1D9F9130&nbsp;&nbsp;0&#038;••••••••••••••!••!&nbsp;•••••••••+0$0.••••••00000000000000#!!!•!0••<br />&nbsp;&nbsp;1D9F9170&nbsp;&nbsp;!00#••••••••!000000$!•••••••!00!••,•••••&nbsp;00000000000000*!!!•0%••<br />&nbsp;&nbsp;1D9F91B0&nbsp;&nbsp;••%0%••••••%00000000/••••••,0.••••%0•••••00000000000000$!••00•••<br />&nbsp;&nbsp;1D9F91F0&nbsp;&nbsp;••!*00••••000000000000••••00!••••••00#•••00000000000000*!!/0••••<br />&nbsp;&nbsp;1D9F9230&nbsp;&nbsp;••!••/0$•00000000000000••0$••••••••*0%!•!00000000000000#•#0$••••<br />&nbsp;&nbsp;1D9F9270&nbsp;&nbsp;•!•••!$•*00000000000000%•!•••••••!(•*0*•&nbsp;00000000000000*•00••••!<br />&nbsp;&nbsp;1D9F92B0&nbsp;&nbsp;(•••••••0000000000000000•••••••!*&nbsp;•••%0•!00000000000000*00••••!0<br />&nbsp;&nbsp;1D9F92F0&nbsp;&nbsp;&#038;!•••••/00000000000000000!•••'$00!••••00*00000000000000*•*!•••00<br />&nbsp;&nbsp;1D9F9330&nbsp;&nbsp;000••••000000000000000000•!•*00/%0••••••*00000000000000$!•!••$0•<br />&nbsp;&nbsp;1D9F9370&nbsp;&nbsp;••%00•!000000000000000000*$00%!••0#••••••00000000000000$!••••0.•<br />&nbsp;&nbsp;1D9F93B0&nbsp;&nbsp;••••$•%0000000000000000000•%!•••••0!••••!00000000000000*!•(•00••<br />&nbsp;&nbsp;1D9F93F0&nbsp;&nbsp;•••(••00000000000000000000!!&nbsp;•••••/0"••••00000000000000#!!!$0•••<br />&nbsp;&nbsp;1D9F9430&nbsp;&nbsp;••!!••00000000000000000000•!!••••!#0%!•••00000000000000*!!*0*•••<br />&nbsp;&nbsp;1D9F9470&nbsp;&nbsp;••!•••00000000000000000000*!•••("!••0#•••00000000000000*!!0,••••<br />&nbsp;&nbsp;1D9F94B0&nbsp;&nbsp;•!&nbsp;•••00000000000000000000#!•!•!••••/0••&nbsp;00000000000000#!%0!••••<br />&nbsp;&nbsp;1D9F94F0&nbsp;&nbsp;••••••00000000000000000000#•*••••••••0%!!00000000000000*!•$•••%0<br />&nbsp;&nbsp;1D9F9530&nbsp;&nbsp;0000#•00000000000000000000#%00000%•••!•!•00000000000000*!!!••!0%<br />&nbsp;&nbsp;1D9F9570&nbsp;&nbsp;*•!&nbsp;••00000000000000000000*#*$!!•0!•••••*00000000000000*!(!••00!<br />&nbsp;&nbsp;1D9F95B0&nbsp;&nbsp;••••••00000000000000000000••!!•••/0•••••#00000000000000#!!!•$0••<br />&nbsp;&nbsp;1D9F95F0&nbsp;&nbsp;••••••%0000000000000000000!(!!••••0%•••••00000000000000*!!!(0*••<br />&nbsp;&nbsp;1D9F9630&nbsp;&nbsp;••!!!!.000000000000000000.!!!••!!!%0-!••!00000000000000*!(•0,•••<br />&nbsp;&nbsp;1D9F9670&nbsp;&nbsp;••!•!•!000000000000000000•#*•••••••,0••••00000000000000$!!$0••••<br />&nbsp;&nbsp;1D9F96B0&nbsp;&nbsp;•!•$00•/00000000000000000•00/*••••••0.!•!00000000000000*!!!!••••<br />&nbsp;&nbsp;1D9F96F0&nbsp;&nbsp;#000•••!0000000000000000$(•.00%•••••&nbsp;•!!•00000000000000*!!••••••<br />&nbsp;&nbsp;1D9F9730&nbsp;&nbsp;00!•••••/000000000000000!!(!!*00••••••&nbsp;!•00000000000000$!!(••••$<br />&nbsp;&nbsp;1D9F9770&nbsp;&nbsp;0•••••••!00000000000000*!!!!!•!0!••••••!$00000000000000#(!!••••0<br />&nbsp;&nbsp;1D9F97B0&nbsp;&nbsp;,••••••!!$000000000000$!!!!!!•!00•••••••$00000000000000*!!!••••0<br />&nbsp;&nbsp;1D9F97F0&nbsp;&nbsp;&nbsp;••••!••••!0000000000$(!!!!!••••0*••••••!00000000000000#!!!•••,/<br />&nbsp;&nbsp;1D9F9830&nbsp;&nbsp;••••!!!•••••00000000*!!!!"!!••••/0••••••!00000000000000*!!!•••0!<br />&nbsp;&nbsp;1D9F9870&nbsp;&nbsp;••••••••••••••$%%%•!!!!!!!!•••••&nbsp;0)••••••00000000000000#!!!••/0•<br />&nbsp;&nbsp;1D9F98B0&nbsp;&nbsp;•••!!•••••••••.,/•(•!!!!!!•••••••0,!!••••00000000000000*!!!••0!•<br />&nbsp;&nbsp;1D9F98F0&nbsp;&nbsp;•••••••••••••00000•!!!!!!••••••••!0!!••••00000000000000#!!!•••••<br />&nbsp;&nbsp;1D9F9930&nbsp;&nbsp;••!!••••••••.000000!!!!!••••••••••••!!••!00000000000000$••!•••••<br />&nbsp;&nbsp;1D9F9970&nbsp;&nbsp;••!•••••••••0000000!•&nbsp;•••••••••••••••!•••00000000000000*!•!•••••<br />&nbsp;&nbsp;1D9F99B0&nbsp;&nbsp;•!!•••••••••0000000$!••••••••••••••••!!•!00000000000000#!!!•••••<br />&nbsp;&nbsp;1D9F99F0&nbsp;&nbsp;•!•••••••••!0000000*!"••••••••••••••••!•&nbsp;00000000000000#!!••••••<br />&nbsp;&nbsp;1D9F9A30&nbsp;&nbsp;••••••••••••0000000#!!••••••••••••••••••!00000000000000#!!!•••••<br />&nbsp;&nbsp;1D9F9A70&nbsp;&nbsp;••••••••••••0000000•!!!••••••••••••••••••00000000000000$!"••••••<br />&nbsp;&nbsp;1D9F9AB0&nbsp;&nbsp;•••••••••••••000000!!!••••••••••••••••••!00000000000000*!!!•••••<br />&nbsp;&nbsp;1D9F9AF0&nbsp;&nbsp;•••••••••••••/0000•(!!!•••••••••••••••••&nbsp;00000000000000#!•!•••••<br />&nbsp;&nbsp;1D9F9B30&nbsp;&nbsp;••••••••••••••!*$•!!!!!••••••••••••••••••00000000000000#!!••••••<br />&nbsp;&nbsp;1D9F9B70&nbsp;&nbsp;••••••••••••••••!!!"!!!••••••••••••••••••00000000000000*!!!•••••<br />&nbsp;&nbsp;1D9F9BB0&nbsp;&nbsp;•••••••••••••••••!!!!!•••••••••••••••••••00000000000000%$#*!!•!&nbsp;<br />&nbsp;&nbsp;1D9F9BF0&nbsp;&nbsp;•!!!••&nbsp;!&nbsp;•!&nbsp;•&nbsp;•&nbsp;!#*$*#!!!•!&nbsp;!!&nbsp;!••&nbsp;!&nbsp;•&nbsp;!*00000000000000000000000<br />&nbsp;&nbsp;1D9F9C30&nbsp;&nbsp;0000000000000000000000000000000000000000000000000000000000000000<br />&nbsp;&nbsp;1D9F9C70&nbsp;&nbsp;0000000000000000000000000000000000000000000000000000000000000000<br />&nbsp;&nbsp;1D9F9CB0&nbsp;&nbsp;0000000000000000000000000000000000000000000000000000000000000000<br />&nbsp;&nbsp;1D9F9CF0&nbsp;&nbsp;0000000000000000000000000000000000000000000000000000000000000000<br />&nbsp;&nbsp;1D9F9D30&nbsp;&nbsp;0000000000000000000000000000000000000000000000000000000000000000<br />&nbsp;&nbsp;1D9F9D70&nbsp;&nbsp;0000000000000000000000000000000000000000000000000000000000000000<br />&nbsp;&nbsp;1D9F9DB0&nbsp;&nbsp;0000000000000000000000000000000000000000000000000000000000000000<br />&nbsp;&nbsp;1D9F9DF0&nbsp;&nbsp;0000000000000000000000000000000000000000000000000000000000000000<br />&nbsp;&nbsp;1D9F9E30&nbsp;&nbsp;0000000000000000000000000000000000000000000000000000000000000000<br />&nbsp;&nbsp;1D9F9E70&nbsp;&nbsp;0000000000000000000000000000000000000000000000000000000000000000<br />&nbsp;Unrecognized&nbsp;symbol&nbsp;'prinf'<br />&nbsp;Closing&nbsp;log<br /></code></p>
<p>I swear this is a real memory dump of a sold-for-money application that I didn&#8217;t have any part in writing.  Unfortunately I don&#8217;t remember some specifics, like which application it was.</p>
]]></content:encoded>
			<wfw:commentRss>http://vgable.com/blog/2008/12/02/bug-in-the-machine/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>I Would Rather Have a Runtime Error Than a Compile Error</title>
		<link>http://vgable.com/blog/2008/09/18/i-would-rather-have-a-runtime-error-than-a-compile-error/</link>
		<comments>http://vgable.com/blog/2008/09/18/i-would-rather-have-a-runtime-error-than-a-compile-error/#comments</comments>
		<pubDate>Thu, 18 Sep 2008 23:49:11 +0000</pubDate>
		<dc:creator>Vincent Gable</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Quotes]]></category>
		<category><![CDATA[Reverse Engineering]]></category>
		<category><![CDATA[Debugging]]></category>
		<category><![CDATA[Dynamic Typing]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Static Typing]]></category>

		<guid isPermaLink="false">http://vgable.com/blog/2008/09/18/i-would-rather-have-a-runtime-error-than-a-compile-error/</guid>
		<description><![CDATA[And the weird thing is, I realized early in my career that I would actually rather have a runtime error than a compile error. [(some laughs)] Because at that time&#8230; now this is way contrary to popular opinion. Everybody wants early error detection. Oh God, not a runtime error, right? But the debugger gives you [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>And the weird thing is, I realized early in my career that I would actually rather have a runtime error than a compile error. [(<em>some laughs</em>)] Because at that time&#8230; now this is way contrary to popular opinion. Everybody wants early error detection. Oh God, not a runtime error, right? But the debugger gives you this ability to start poking and prodding, especially in a more dynamic language, where you can start simulating things, you can back it up&#8230; You&#8217;ve got your time-machine debuggers like the OCaml one, that can actually save the states and back up.</p>
<p>You&#8217;ve got amazing tools at your disposal (in the debugger)&#8230; Whereas if the compiler gives you an error that says &#8220;expected expression angle-bracket&#8221;, you don&#8217;t have a &#8220;compiler-debugger&#8221; that you can shell into&#8230;</p>
<p><strong>So, you know, in some sense, your runtime errors are actually kind of nicer.</strong></p></blockquote>
<p>&#8211; An excerpt from <a href="http://steve-yegge.blogspot.com/2008/05/dynamic-languages-strike-back.html">one of Steve Yegge&#8217;s (long!) talks</a>.</p>
<p>I think there is a real nugget of truth in this.  At runtime, you can examine your program&#8217;s <em>state</em>, but there is absolutely no way to do that at compile time.  Without a debugger, you can&#8217;t just look at some nontrivial code and <em>know</em> what the value of <code>x</code> is when there&#8217;s an error reading <code>y</code>.  (Adding <code>"print x"</code>, recompiling, and trying again, would work of course, but that&#8217;s just using your compiler as an inefficient debugger!)</p>
<p>Similarly, <em><a href="http://www.mindview.net/WebLog/log-0025">Strong Typing vs. Strong Testing</a> </em>, essentially argues that some tests can only be made at runtime.  (If you read any links on this page, <a href="http://www.mindview.net/WebLog/log-0025">read it</a>, it&#8217;s much shorter and to the point).</p>
]]></content:encoded>
			<wfw:commentRss>http://vgable.com/blog/2008/09/18/i-would-rather-have-a-runtime-error-than-a-compile-error/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Crash Reporter Prefs</title>
		<link>http://vgable.com/blog/2008/07/14/crash-reporter-prefs/</link>
		<comments>http://vgable.com/blog/2008/07/14/crash-reporter-prefs/#comments</comments>
		<pubDate>Mon, 14 Jul 2008 13:48:46 +0000</pubDate>
		<dc:creator>Vincent Gable</dc:creator>
				<category><![CDATA[MacOSX]]></category>
		<category><![CDATA[Reverse Engineering]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[Debugging]]></category>

		<guid isPermaLink="false">http://vgable.com/blog/2008/07/14/crash-reporter-prefs/</guid>
		<description><![CDATA[/Developer/Applications/Utilities/CrashReporterPrefs.app can make crash reports much more useful. It will show crash-reports for background processes, and stack-trace in the notification dialog. Crash report-files are stored in ~/Library/Logs/CrashReporter/ Unfortunately, crash reports are not sent back to third-party developers, even when you send them to Apple. EDITED TO ADD: This still works in Snow Leopard (Mac OS [...]]]></description>
			<content:encoded><![CDATA[<p><code>/Developer/Applications/Utilities/CrashReporterPrefs.app</code> can make crash reports much more useful. It will show crash-reports for background processes, and stack-trace in the notification dialog.</p>
<p>Crash report-files are stored in <code>~/Library/Logs/CrashReporter/</code></p>
<p>Unfortunately, crash reports are <strong>not</strong> sent back to third-party developers, even when you send them to Apple.</p>
<p>EDITED TO ADD: This still works in Snow Leopard (Mac OS X 10.5.6)</p>
]]></content:encoded>
			<wfw:commentRss>http://vgable.com/blog/2008/07/14/crash-reporter-prefs/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Getting OS X Icons</title>
		<link>http://vgable.com/blog/2008/07/07/getting-os-x-icons/</link>
		<comments>http://vgable.com/blog/2008/07/07/getting-os-x-icons/#comments</comments>
		<pubDate>Tue, 08 Jul 2008 01:43:41 +0000</pubDate>
		<dc:creator>Vincent Gable</dc:creator>
				<category><![CDATA[Design]]></category>
		<category><![CDATA[MacOSX]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Reverse Engineering]]></category>
		<category><![CDATA[Usability]]></category>
		<category><![CDATA[Icons]]></category>
		<category><![CDATA[Images]]></category>

		<guid isPermaLink="false">http://vgable.com/blog/2008/07/07/getting-os-x-icons/</guid>
		<description><![CDATA[This is what the Apple HIG has to say about icons. You should read it if you ever use icons. Even if you are not drawing your own icons, you need to understand how they should be used. (eg: icons in a toolbar should have a flat &#8220;head on&#8221; perspective, not the three-demensional look they [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://developer.apple.com/documentation/UserExperience/Conceptual/OSXHIGuidelines/XHIGIcons/chapter_14_section_1.html">This is what the Apple HIG has to say about icons.</a>  You should read it if you ever use icons.  Even if you are not drawing your own icons, you need to understand how they should be used.  (eg: icons in a toolbar should have a flat &#8220;head on&#8221; perspective, not the three-demensional look they have in the Dock.)  You&#8217;ll find the icons you need faster if you know what they should look like.</p>
<p>Websites with icons you can <b>use freely</b>: <a href="http://www.icondrawer.com/free.php">IconDrawer</a>, <a href="http://iconfactory.com/freeware">Iconfactory</a>, <a href="http://www.kombine.net/icons.php">Kombine.net</a>.</p>
<p><a href="http://www.noodlesoft.com/blog/2006/09/10/system-icon-viewer/"> SystemIconViewer (source included)</a> by <a href="http://www.noodlesoft.com/index.php">Noodlesoft</a> is a useful tool.  It lets you browse over 100 standard OS X icons that are available programatically. </p>
<p>For getting paths to private OS X icons, try poking around inside <a href="http://www.panic.com/candybar/">CandyBar.app</a> &#8212; A commercial program that lets you customize just about any icon on your system.  As of v2.6.1 <code>/CandyBar.app/Contents/Resources/English.lproj/IconData.plist</code> contains information on where icons are located.  Icon locations do change completely between releases of OS X, even if the icon itself does not!  I found <a href="http://www.panic.com/candybar/">CandyBar</a> to be a better source of up-to-date icon locations then google. <code>IconData.plist</code> is pretty big and dense, but you can search it for keywords if you open it in Xcode, which helped me a lot.</p>
<p>(Although I haven&#8217;t used any of them personally, <a href="http://developer.apple.com/business/aida.html">these are some design firms Apple recommends</a>, if you have the cash.)</p>
]]></content:encoded>
			<wfw:commentRss>http://vgable.com/blog/2008/07/07/getting-os-x-icons/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

