<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;CkMBQ3o4eip7ImA9WhVUF0U.&quot;"><id>tag:blogger.com,1999:blog-6789056281440007248</id><updated>2012-05-23T14:40:52.432+01:00</updated><category term="logging" /><category term="how it works" /><category term="EL 7.x" /><category term="Visual Studio" /><category term="tools" /><category term="debugging" /><category term="shareware" /><category term="how-to" /><category term="OSX" /><category term="memory leaks" /><category term="Win64" /><category term="feature" /><category term="customizations" /><category term="Random thoughts" /><category term="best practice" /><category term="Releases" /><category term="Access Violation" /><category term="tips" /><category term="Delphi" /><category term="other tools" /><category term="EL 6.x" /><category term="compiling" /><category term="external" /><category term="command line" /><category term="Blog" /><category term="bug reports" /><category term="additional features" /><category term="non-technical" /><title>EurekaLog's blog</title><subtitle type="html">Your place for information about EurekaLog and debugging.</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://eurekalog.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://eurekalog.blogspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/6789056281440007248/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Александр Алексеев</name><uri>https://profiles.google.com/113168002104297556003</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-aUMttZQBsuI/AAAAAAAAAAI/AAAAAAAAC3Y/QuZ7K9t_WzE/s512-c/photo.jpg" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>42</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/EurekaLog" /><feedburner:info uri="eurekalog" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId>EurekaLog</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><feedburner:feedFlare href="http://add.my.yahoo.com/rss?url=http%3A%2F%2Ffeeds.feedburner.com%2FEurekaLog" src="http://us.i1.yimg.com/us.yimg.com/i/us/my/addtomyyahoo4.gif">Subscribe with My Yahoo!</feedburner:feedFlare><feedburner:feedFlare href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2FEurekaLog" src="http://www.newsgator.com/images/ngsub1.gif">Subscribe with NewsGator</feedburner:feedFlare><feedburner:feedFlare href="http://feeds.my.aol.com/add.jsp?url=http%3A%2F%2Ffeeds.feedburner.com%2FEurekaLog" src="http://o.aolcdn.com/favorites.my.aol.com/webmaster/ffclient/webroot/locale/en-US/images/myAOLButtonSmall.gif">Subscribe with My AOL</feedburner:feedFlare><feedburner:feedFlare href="http://www.bloglines.com/sub/http://feeds.feedburner.com/EurekaLog" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Ffeeds.feedburner.com%2FEurekaLog" src="http://www.netvibes.com/img/add2netvibes.gif">Subscribe with Netvibes</feedburner:feedFlare><feedburner:feedFlare href="http://fusion.google.com/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2FEurekaLog" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare href="http://www.pageflakes.com/subscribe.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2FEurekaLog" src="http://www.pageflakes.com/ImageFile.ashx?instanceId=Static_4&amp;fileName=ATP_blu_91x17.gif">Subscribe with Pageflakes</feedburner:feedFlare><feedburner:feedFlare href="http://www.plusmo.com/add?url=http%3A%2F%2Ffeeds.feedburner.com%2FEurekaLog" src="http://plusmo.com/res/graphics/fbplusmo.gif">Subscribe with Plusmo</feedburner:feedFlare><feedburner:feedFlare href="http://www.thefreedictionary.com/_/hp/AddRSS.aspx?http%3A%2F%2Ffeeds.feedburner.com%2FEurekaLog" src="http://img.tfd.com/hp/addToTheFreeDictionary.gif">Subscribe with The Free Dictionary</feedburner:feedFlare><feedburner:feedFlare href="http://www.bitty.com/manual/?contenttype=rssfeed&amp;contentvalue=http%3A%2F%2Ffeeds.feedburner.com%2FEurekaLog" src="http://www.bitty.com/img/bittychicklet_91x17.gif">Subscribe with Bitty Browser</feedburner:feedFlare><feedburner:feedFlare href="http://www.live.com/?add=http%3A%2F%2Ffeeds.feedburner.com%2FEurekaLog" src="http://tkfiles.storage.msn.com/x1piYkpqHC_35nIp1gLE68-wvzLZO8iXl_JMledmJQXP-XTBOLfmQv4zhj4MhcWEJh_GtoBIiAl1Mjh-ndp9k47If7hTaFno0mxW9_i3p_5qQw">Subscribe with Live.com</feedburner:feedFlare><feedburner:feedFlare href="http://mix.excite.eu/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2FEurekaLog" src="http://image.excite.co.uk/mix/addtomix.gif">Subscribe with Excite MIX</feedburner:feedFlare><feedburner:feedFlare href="http://www.webwag.com/wwgthis.php?url=http%3A%2F%2Ffeeds.feedburner.com%2FEurekaLog" src="http://www.webwag.com/images/wwgthis.gif">Subscribe with Webwag</feedburner:feedFlare><feedburner:feedFlare href="http://www.podcastready.com/oneclick_bookmark.php?url=http%3A%2F%2Ffeeds.feedburner.com%2FEurekaLog" src="http://www.podcastready.com/images/podcastready_button.gif">Subscribe with Podcast Ready</feedburner:feedFlare><feedburner:feedFlare href="http://www.wikio.com/subscribe?url=http%3A%2F%2Ffeeds.feedburner.com%2FEurekaLog" src="http://www.wikio.com/shared/img/add2wikio.gif">Subscribe with Wikio</feedburner:feedFlare><feedburner:feedFlare href="http://www.dailyrotation.com/index.php?feed=http%3A%2F%2Ffeeds.feedburner.com%2FEurekaLog" src="http://www.dailyrotation.com/rss-dr2.gif">Subscribe with Daily Rotation</feedburner:feedFlare><entry gd:etag="W/&quot;DEYBRns8fyp7ImA9WhVUFkw.&quot;"><id>tag:blogger.com,1999:blog-6789056281440007248.post-9066384140054373550</id><published>2012-05-21T17:02:00.002+01:00</published><updated>2012-05-21T17:02:37.577+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-05-21T17:02:37.577+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="tools" /><category scheme="http://www.blogger.com/atom/ns#" term="Win64" /><category scheme="http://www.blogger.com/atom/ns#" term="EL 7.x" /><title>What my application is doing? (introducing Threads Snapshot Tool)</title><content type="html">Have you ever wondered what your application might do in this very moment? Have you tried to troubleshoot hangs and deadlocks?&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;h1&gt;


Attaching debugger&lt;/h1&gt;
Well, you can connect a Delphi debugger to your application. Just launch Delphi, open your project and use "Run" / "Attach to process" command. Select your process and click OK. Now you can use threads window (View / Debug windows / Threads) and call stack window (View / Debug windows / Call stack) to analyze state of your application. You may check what it's doing, check variables values, etc.&lt;br /&gt;
&lt;br /&gt;
But what if debugger is not available? Sure, you can try to install and use Delphi remote debugger. What if this happens on customer's machine? Yeah, you can ask customer if he can allow you to connect to his machine, install remote debugger and analyze the case. That sounds not very comfortable...&lt;br /&gt;
&lt;br /&gt;
&lt;h1&gt;
Threads Snapshot Tool&lt;/h1&gt;
EurekaLog 7 as well as standalone EurekaLog Tools Pack have a Threads Snapshot Tool, which can help you to peek inside running applications. Basically, it's a simple GUI exe with 1 helper DLL. You can pack it into .zip archive and send it to the customer, asking to run it on his machine. Then customer may send you log files back, so you can analyze them locally.&lt;br /&gt;
&lt;br /&gt;
Here is how it looks:&lt;br /&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-uesc8nmcNX0/T7pfCwgyy4I/AAAAAAAADsM/WyOGCmv1kPU/s1600/ThreadsSnapshotTool.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="397" src="http://2.bp.blogspot.com/-uesc8nmcNX0/T7pfCwgyy4I/AAAAAAAADsM/WyOGCmv1kPU/s400/ThreadsSnapshotTool.png" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;UI of Threads Snapshot Tool&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
All you need to do is to select your running application and click on the button. This will ask you where to save log files and will take a snapshot of all threads inside selected application.&lt;br /&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-QTobcNTAQCc/T7pgPX9eTEI/AAAAAAAADsY/A2D8xRp_cQw/s1600/Success.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="220" src="http://4.bp.blogspot.com/-QTobcNTAQCc/T7pgPX9eTEI/AAAAAAAADsY/A2D8xRp_cQw/s400/Success.png" width="342" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Log file was created&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
Here is a sample log from the hang inside some simple application:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;Process [ 0E8C / 3724 ]: C:\Users\Александр\Documents\RAD Studio\Projects\RichEdit\richeditdemo.exe (2012.05.21 19:15:27)

[ 2CA8 / 11432 ] Priority: 8

EIP:    7727F8B1  EFlags: 00000246
EBP:    0018FB5C  ESP:    0018FAF0
EAX:    00000000  EBX:    00000000  ECX:    00000000  EDX:    00000000
ESI:    000006BC  EDI:    00000000
SegCS:  00000023  CegSS:  0000002B  SegGS:  0000002B  SegFS:  00000053  SegES:  0000002B  SegDS:  0000002B

DeadLock: True
Blocked waiting for thread [ 27DC / 10204 ]
thread -&amp;gt; thread: [ 27DC / 10204 ] is blocked -&amp;gt; SendMessage -&amp;gt; thread: [ 2CA8 / 11432 ] is blocked

-------------------------------------------------------------------------------------------------------------------------------------
|Methods |Details|Stack   |Address |Module          |Offset  |Unit        |Class           |Procedure/Method               |Line    |
-------------------------------------------------------------------------------------------------------------------------------------
|Running Thread: ID=11432; Parent=0; Priority=0                                                                                     |
|Class=; Name=                                                                                                                      |
|Comment=                                                                                                                           |
|-----------------------------------------------------------------------------------------------------------------------------------|
|7FFFFFFE|03     |00000000|7727F8B1|ntdll.dll       |0001F8B1|ntdll       |                |ZwWaitForSingleObject          |        |
|00000020|03     |0018FB60|764A118F|kernel32.dll    |0001118F|kernel32    |                |WaitForSingleObjectEx          |        |
|00000020|03     |0018FB78|764A1143|kernel32.dll    |00011143|kernel32    |                |WaitForSingleObject            |        |
|00000020|04     |0018FB8C|004E69A9|richeditdemo.exe|000E69A9|remain      |TMainForm       |FileOpen                       |351[5]  |
|00000020|03     |0018FBB4|0044AFAB|richeditdemo.exe|0004AFAB|Classes     |TBasicAction    |Execute                        |        |
|00000020|03     |0018FBBC|004658FD|richeditdemo.exe|000658FD|ActnList    |TContainedAction|Execute                        |        |
|00000020|03     |0018FBCC|004666B8|richeditdemo.exe|000666B8|ActnList    |TCustomAction   |Execute                        |        |
|00000020|03     |0018FBE0|00495F00|richeditdemo.exe|00095F00|Menus       |TMenuItem       |Click                          |        |
|00000020|03     |0018FBEC|00497413|richeditdemo.exe|00097413|Menus       |TMenu           |DispatchCommand                |        |
|00000020|03     |0018FBF4|004DB9EB|richeditdemo.exe|000DB9EB|Forms       |TCustomForm     |WMCommand                      |        |
|00000020|03     |0018FC00|00476D64|richeditdemo.exe|00076D64|Controls    |TControl        |WndProc                        |        |
|00000020|03     |0018FC18|0047B628|richeditdemo.exe|0007B628|Controls    |TWinControl     |WndProc                        |        |
|00000020|03     |0018FD7C|004D88FC|richeditdemo.exe|000D88FC|Forms       |TCustomForm     |WndProc                        |        |
|00000020|03     |0018FDA8|0047ACC8|richeditdemo.exe|0007ACC8|Controls    |TWinControl     |MainWndProc                    |        |
|00000020|03     |0018FDD8|0044B650|richeditdemo.exe|0004B650|Classes     |                |StdWndProc                     |        |
|00000020|03     |0018FE1C|750B6D35|USER32.dll      |00016D35|USER32      |                |(possible GetThreadDesktop+210)|        |
|00000020|03     |0018FE94|750B77BF|USER32.dll      |000177BF|USER32      |                |(possible CharPrevW+307)       |        |
|00000020|03     |0018FEF4|750B7885|USER32.dll      |00017885|USER32      |                |DispatchMessageW               |        |
|00000020|03     |0018FF04|004E182F|richeditdemo.exe|000E182F|Forms       |TApplication    |ProcessMessage                 |        |
|00000020|03     |0018FF20|004E1872|richeditdemo.exe|000E1872|Forms       |TApplication    |HandleMessage                  |        |
|00000020|03     |0018FF44|004E1B9D|richeditdemo.exe|000E1B9D|Forms       |TApplication    |Run                            |        |
|00000020|04     |0018FF74|004EDCE8|richeditdemo.exe|000EDCE8|richeditdemo|                |Initialization                 |15[4]   |
|00000020|03     |0018FF8C|764A3398|kernel32.dll    |00013398|kernel32    |                |BaseThreadInitThunk            |        |
-------------------------------------------------------------------------------------------------------------------------------------

[ 27DC / 10204 ] Priority: 8

EIP:    750B72B9  EFlags: 00000246
EBP:    02D0FEF8  ESP:    02D0FEB8
EAX:    00D59FB0  EBX:    02090F60  ECX:    00000000  EDX:    00000000
ESI:    00D59FB0  EDI:    00000000
SegCS:  00000023  CegSS:  0000002B  SegGS:  0000002B  SegFS:  00000053  SegES:  0000002B  SegDS:  0000002B

DeadLock: True
Blocked waiting for SendMessage owned by thread [ 2CA8 / 11432 ]
thread -&amp;gt; SendMessage -&amp;gt; thread: [ 2CA8 / 11432 ] is blocked -&amp;gt; thread: [ 27DC / 10204 ] is blocked

-------------------------------------------------------------------------------------------------------------------
|Methods |Details|Stack   |Address |Module          |Offset  |Unit    |Class      |Procedure/Method       |Line   |
-------------------------------------------------------------------------------------------------------------------
|Running Thread: ID=10204; Parent=0; Priority=0                                                                   |
|Class=; Name=                                                                                                    |
|Comment=                                                                                                         |
|-----------------------------------------------------------------------------------------------------------------|
|7FFFFFFE|03     |00000000|750B72B9|USER32.dll      |000172B9|USER32  |           |(possible GetPropW+146)|       |
|00000020|03     |02D0FEFC|750B96C0|USER32.dll      |000196C0|USER32  |           |SendMessageW           |       |
|00000020|04     |02D0FF20|004E6918|richeditdemo.exe|000E6918|remain  |TLoadThread|UpdateStatus           |336[1] |
|00000020|04     |02D0FF3C|004E68F6|richeditdemo.exe|000E68F6|remain  |TLoadThread|Execute                |331[1] |
|00000020|03     |02D0FF48|00448FDA|richeditdemo.exe|00048FDA|Classes |           |ThreadProc             |       |
|00000020|03     |02D0FF78|00406828|richeditdemo.exe|00006828|System  |           |ThreadWrapper          |       |
|00000020|03     |02D0FF8C|764A3398|kernel32.dll    |00013398|kernel32|           |BaseThreadInitThunk    |       |
-------------------------------------------------------------------------------------------------------------------&lt;/pre&gt;
&lt;br /&gt;
When you have such log file - can you determinate why the application is not responding?&lt;br /&gt;
&lt;br /&gt;
Yes, now you can do it very easily. First, note that there are &lt;b&gt;two threads&lt;/b&gt;, both of each is in a &lt;b&gt;deadlock&lt;/b&gt; state (note "Deadlock: True"). Two deadlocks mean that these two threads are waiting for each other. Why they do it? You can determinate this either by looking at &lt;b&gt;call stack&lt;/b&gt; or at &lt;b&gt;wait chains&lt;/b&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;h1&gt;Analyzing call stacks&lt;/h1&gt;
Call stack for first thread indicate that main thread has called WaitForSingleObject function to wait for something inside it's &lt;code&gt;TMainForm.FileOpen&lt;/code&gt; method. You can determinate what main thread waits by looking at source code:
&lt;pre class="brush:delphi"&gt;WaitForSingleObject(LoadThread.Handle, INFINITE); // remain.pas, line 351&lt;/pre&gt; 
&lt;br /&gt;
Second thread is a worker thread. It calls &lt;code&gt;SendMessage&lt;/code&gt; from its &lt;code&gt;UpdateStatus&lt;/code&gt; method. You can determinate which window will receive this message by looking at source code:
&lt;pre class="brush:delphi"&gt;SendMessage(MainForm.Handle, WM_DoSomething, 0, 0); // remain.pas, line 336&lt;/pre&gt; 
&lt;br /&gt;
As you can see, main thread created a worker thread to load file in the background and is waiting for its completion. And worker thread tried to update status of main window by sending a window message to it. Thus, you get a hang, because main thead is waiting for worker thread and it can not process message, which background thread has sent to it. And this is the reason for the hang.&lt;br /&gt;
&lt;br /&gt;
&lt;h1&gt;Analyzing wait chains&lt;/h1&gt;
And you can confirm this guess by looking at wait chains for each thread. Wait chain for main thread is:
&lt;pre&gt;Blocked waiting for thread [ 27DC / 10204 ]
thread -&amp;gt; thread: [ 27DC / 10204 ] is blocked -&amp;gt; SendMessage -&amp;gt; thread: [ 2CA8 / 11432 ] is blocked&lt;/pre&gt;
Which means: "main thread (2CA8) is blocked by waiting for worker thread (27DC), which is blocked by SendMessage, which is waiting for thread 2CA8 (which is the main thead)".&lt;br /&gt;
&lt;br /&gt;
Wait chain for worker thread is:
&lt;pre&gt;Blocked waiting for SendMessage owned by thread [ 2CA8 / 11432 ]
thread -&amp;gt; SendMessage -&amp;gt; thread: [ 2CA8 / 11432 ] is blocked -&amp;gt; thread: [ 27DC / 10204 ] is blocked&lt;/pre&gt;
Which means: "worker thread (27DC) is blocked by SendMessage, which is waiting for main thread (2CA8), which is waiting for thread 27DC (which is the worker thread)".&lt;br /&gt;
&lt;br /&gt;
So, you immediately get information about what both threads are waiting for! Any of two wait chains allows you to fully reconstruct the problem scenario.&lt;br /&gt;
&lt;br /&gt;
&lt;h1&gt;Final notes&lt;/h1&gt;
Threads Snapshot Tool requres debug information for your application to display human-readable call stacks. It supports all usual sources of debug information for EurekaLog 7: EurekaLog itself, map files, TD32/TDS, DLL export, JclDebug, madExcept, Microsoft formats. Therefore, if you compile your application with EurekaLog (any version) - then you do not need any additional actions. If not - then you need to supply debug information for your application. One simple way to do this - set "Map file" = "Detailed" option ("Linker" tab in project options inside IDE) and deploy .map files along with your .exe and .dll files.&lt;br /&gt;
&lt;br /&gt;
Wait Chains are created only on Windows Vista and above. For Windows XP and below - only call stacks and CPU states are provided.&lt;br /&gt; 
&lt;br /&gt;
Threads Snapshot Tool is available in both x86-32 and x86-64 versions. You need to use application of corresponding bitness. Attempt to use 32-bit Threads Snapshot Tool to capture state of 64-bit application (and visa versa) will result in error message.&lt;br /&gt;
&lt;br /&gt;
32-bit version of Threads Snapshot Tool is installed under &lt;code&gt;C:\Program Files\EurekaLab\EurekaLog 7\Bin\&lt;/code&gt; folder by default. 64-bit version is installed only on 64-bit editions of Windows. It's placed in &lt;code&gt;C:\Program Files (x86)\EurekaLab\EurekaLog 7\Bin64\&lt;/code&gt; by default.&lt;br /&gt;
&lt;br /&gt;
Threads Snapshot Tool consists of &lt;code&gt;ThreadsSnapshotGUI.exe&lt;/code&gt; and &lt;code&gt;ThreadsSnapshotWorkerDLL.dll&lt;/code&gt; files. Those are the files which you can copy to another machine. &lt;code&gt;ThreadsSnapshot.exe&lt;/code&gt; is a console equivalent of &lt;code&gt;ThreadsSnapshotGUI.exe&lt;/code&gt; file. You can use it to capture state from the console by calling it with arguments (launch it without agruments to get help on using).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6789056281440007248-9066384140054373550?l=eurekalog.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=EeEyqscx6UE:U7qsrgtlUz4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=EeEyqscx6UE:U7qsrgtlUz4:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?i=EeEyqscx6UE:U7qsrgtlUz4:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=EeEyqscx6UE:U7qsrgtlUz4:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?i=EeEyqscx6UE:U7qsrgtlUz4:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=EeEyqscx6UE:U7qsrgtlUz4:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?i=EeEyqscx6UE:U7qsrgtlUz4:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=EeEyqscx6UE:U7qsrgtlUz4:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?i=EeEyqscx6UE:U7qsrgtlUz4:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=EeEyqscx6UE:U7qsrgtlUz4:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/EurekaLog/~4/EeEyqscx6UE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://eurekalog.blogspot.com/feeds/9066384140054373550/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://eurekalog.blogspot.com/2012/05/what-my-application-is-doing.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6789056281440007248/posts/default/9066384140054373550?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6789056281440007248/posts/default/9066384140054373550?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/EurekaLog/~3/EeEyqscx6UE/what-my-application-is-doing.html" title="What my application is doing? (introducing Threads Snapshot Tool)" /><author><name>Александр Алексеев</name><uri>https://profiles.google.com/113168002104297556003</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-aUMttZQBsuI/AAAAAAAAAAI/AAAAAAAAC3Y/QuZ7K9t_WzE/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-uesc8nmcNX0/T7pfCwgyy4I/AAAAAAAADsM/WyOGCmv1kPU/s72-c/ThreadsSnapshotTool.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://eurekalog.blogspot.com/2012/05/what-my-application-is-doing.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0YERXY8eCp7ImA9WhVREUo.&quot;"><id>tag:blogger.com,1999:blog-6789056281440007248.post-1735348158417745550</id><published>2012-03-19T16:38:00.001Z</published><updated>2012-03-19T16:38:24.870Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-03-19T16:38:24.870Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Delphi" /><category scheme="http://www.blogger.com/atom/ns#" term="tools" /><category scheme="http://www.blogger.com/atom/ns#" term="Win64" /><category scheme="http://www.blogger.com/atom/ns#" term="EL 7.x" /><title>What does this address mean? (introducing Address Lookup Tool)</title><content type="html">Did you ever encounter cryptic error messages like "Access violation at address 00515974 in module 'Project1.exe'. Write of address 00000056"? Have you wondered what source code line is mentioned in this error message? Well, look no further...&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;h1&gt;



Exception tracer solution?&lt;/h1&gt;
Well, basically, if you use EurekaLog or any other exception tracer tool - you usually don't get just "Access Violation at address..." error message, but get a full bug report instead - including call stack and CPU state. However, if:
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;you're working with application without exception tracer&lt;/li&gt;
&lt;li&gt;application handles the error by itself without passing it to exception tracer&lt;/li&gt;
&lt;/ul&gt;
then you will have a simple error message only, without any advanced/detailed information. If you can reproduce this case again - good. You can catch it under the debugger and analyze the situation. But if you for some reason is unable to do that, but urgently need to restore original source code point - you're stuck with numbers like "00515974".&lt;br /&gt;
&lt;br /&gt;
&lt;h1&gt;Address Lookup Tool&lt;/h1&gt;
EurekaLog 7 as well as standalone EurekaLog Tools Pack have a Address Lookup Tool, which can help you to analyze addresses in the application and provide more information than just RAW address. You can launch this tool via Start menu (Programs\EurekaLog 7\Tools\Address Lookup) or via Tools\EurekaLog\Address Lookup IDE command (for EurekaLog 7 only, not applicable to Tools Pack).&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Note:&lt;/b&gt; there are 32-bit and 64-bit versions available. Use the tool of corresponding bitness. 32-bit Address Lookup will fail for 64-bit executable files and visa versa. 64-bit Address Lookup will only be installed on Win64 machine.&lt;br /&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-pGOJV7NwMtw/T2c8oSiug-I/AAAAAAAADjo/KUGZFtVnIvk/s1600/AddressLookup.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="358" src="http://1.bp.blogspot.com/-pGOJV7NwMtw/T2c8oSiug-I/AAAAAAAADjo/KUGZFtVnIvk/s400/AddressLookup.png" width="306" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Address Lookup main window&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
As you can see - the interface is simple. First, you need to specify your application. It can be .exe file, DLL or BPL (package). Use the file which has raised the error in question. If it's not mentioned in error message - you can try to find it from address by using other tools (see more detailed explanation below). Of course, executable file must match the file which has raised the error. I.e. you can't use version 2 of your application to resolve addresses from version 1 - that will most probably don't work, since addresses may be changed.&lt;br /&gt;
&lt;br /&gt;
Next, select source of debug information to lookup. Usually, you should leave this option in its default position - "Auto". But you may want to use specific source, if you want to.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Note:&lt;/b&gt; support for madExcept information is experimental. It may not always work properly.&lt;br /&gt;
&lt;br /&gt;
So, basically, you'll need at least one source of debug information available. If you use EurekaLog or other exception tracer solution - you already have one. If not - then you should supply it manually. The easiest way to do this - enable Map file = Detailed option on Linker page from project options in IDE (however, you'll need to rebuild your application).&lt;br /&gt;
&lt;br /&gt;
Last thing to do - is to enter address itself. There is a catch though. Usually you get the full &lt;i&gt;absolute address&lt;/i&gt; like "00515974" in the example above. This address can not be resolved into source code line. What you need is to have an &lt;i&gt;offset&lt;/i&gt; from the start of the exe/DLL/BPL file. If you have .exe file - this task is easy: just substract $400000 from your address value and you're done:&lt;br /&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-X9ndn698XvI/T2dJzPE92LI/AAAAAAAADj0/eoXZnCRSRS4/s1600/AddressLookupResolve.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="284" src="http://3.bp.blogspot.com/-X9ndn698XvI/T2dJzPE92LI/AAAAAAAADj0/eoXZnCRSRS4/s400/AddressLookupResolve.png" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Looking for source line from address (click on image to enlarge)&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;code&gt;$00515974 - $00400000 = $00115974&lt;/code&gt; - and (as you can see) this is line number 128 in Unit99.pas, which belongs to &lt;code&gt;TForm99.Button1Click&lt;/code&gt; method. Location found.&lt;br /&gt;
&lt;br /&gt;
The Address Lookup Tool also supports include files:&lt;br /&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-vkKLGR3FhxI/T2dQ97JP8nI/AAAAAAAADkA/18RKOamYG7s/s1600/AddressLookupInclude.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="284" src="http://4.bp.blogspot.com/-vkKLGR3FhxI/T2dQ97JP8nI/AAAAAAAADkA/18RKOamYG7s/s400/AddressLookupInclude.png" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Finding address inside .inc file (click to enlarge)&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
A quick explanation for the information description:
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Provider&lt;/b&gt; - is the name of a EurekaLog debug information provider class, which was able to extract location information from your executable. If you leave "Auto" position in "Debug information source" option - then this can be any class among supported. If you select specific source - then this will be specific class only which corresponds to your choice.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Location&lt;/b&gt; - a short description of found source code location. The same information is provided below this line with more detailed view:
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Unit&lt;/b&gt; - name of the unit with the code. This is the name as it appears into "&lt;code&gt;unit &lt;i&gt;UnitName&lt;/i&gt;;&lt;/code&gt;" statement.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Source&lt;/b&gt; - name of source file. Well, usually this is the same as unit name + .pas extension, but it is not necessary so. Think about .dpr file and .inc files. This is the file which you need to open, if you want to see source code location.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Class&lt;/b&gt; - name of the class to which belongs method. If your address belongs to simple function - class name will be empty.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Routine&lt;/b&gt; - name of the routine (procedure, function or method).&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Line&lt;/b&gt; - absolute line number inside "source" file.&lt;/li&gt;
&lt;/ul&gt;
The values which are not present in the below detalization are: offset ("&lt;b&gt;(00114974)&lt;/b&gt;"), binary file name ("&lt;b&gt;{Project102.exe}&lt;/b&gt;") and absolute address ("&lt;b&gt;[0B735974]&lt;/b&gt;"). These values do not tell you any additional information and are provided only for sanity checks. Please note that .exe file will be loaded at the different base address than $00400000 (because $00400000 is already busy by AddressLookup.exe), so calculated absolute address (0B735974) will not match your data.
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Routine offset (bytes)&lt;/b&gt; - the difference (offset) between current address and routine's start in bytes.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Routine offset (lines)&lt;/b&gt; - the difference (offset) between current line and first line in routine (in lines). This valus is useless if you use include files inside routine.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Line offset (bytes)&lt;/b&gt; - the offset of code from the start of the current line in bytes. This is applicable for complex expressions in single line.&lt;/li&gt;
&lt;/ul&gt;
The last 3 pieces of information can help you to track down location if source code was changed. For example, suppose that you have a error in version 1 of your application, and you search for source code location using .exe file from version 1; of course, you'll get location in source code for version 1. But what if you don't source code for version 1 of your application? Then you still can try to find it if source code wasn't changed much around your address. Just find routine by name in source code of version 2 and then shift down from the start of the routine to the specified amound of lines (or bytes) - and you'll get to the desired location.&lt;br /&gt;
&lt;br /&gt;
&lt;h1&gt;Working with addresses and offsets&lt;/h1&gt;
Each executable module (exe or DLL) can be loaded into memory on different addresses, which are called &lt;em&gt;base addresses&lt;/em&gt;. As you can guess, the same code will have different address if it was loaded on different base addresses. Thus, absolute address of code location is usually useless - because base address of executable on analyzing stage may be different than it was when the error was raised.&lt;br /&gt;
&lt;br /&gt;
For example, suppose there was an error in your DLL at address $6E775974 and DLL itself was loaded at address $6E660000 (which is base address for that DLL). Now, you want to find source code location for that DLL from address $6E775974. So, you load DLL and try to look for this address, but on your machine DLL is now loaded at address $642A0000 (not $6E660000 - as it was when error was raised). This means that address $6E775974 is useless - it will point to something else.&lt;br /&gt;
&lt;br /&gt;
This is similar to the process address space isolation, when two processes can have different data on the same address. If you need to exchange data between processes you can't pass pointers (addresses) - you need to use relative offsets.&lt;br /&gt;
&lt;br /&gt;
The similar approach is applied here too: find an offset of your code from the start of the module. In our imaginable example this is $6E775974 - $6E660000 = $00115974. And now - when you have offset - you can find exact the same location at any time. Just retrieve the base address of DLL (you can use &lt;a href="http://technet.microsoft.com/en-us/sysinternals/bb896653" title="Technet: Process Explorer by Mark Russinovich"&gt;Process Explorer tool&lt;/a&gt; to find it) and add our offset to it: $642A0000 + $00115974 = $643B5974 - and that is the final address of your code when you loaded DLL.&lt;br /&gt;
&lt;br /&gt;
So that is how you work with addresses and offsets. To find source code location you need either:
&lt;ul&gt;
&lt;li&gt;relative offset (1 value)&lt;/li&gt;
&lt;li&gt;absolute address and base address (2 values)&lt;/li&gt;
&lt;/ul&gt;
Just absolute address alone is useless.&lt;br /&gt;
&lt;br /&gt;
However, there is a quick tip: exe files are loaded at the same address in 99.99% cases. So you can blindly assume the base address of $00400000 for .exe files.&lt;br /&gt;
&lt;br /&gt;
&lt;h1&gt;Manual search&lt;/h1&gt;
If you can't use Address Lookup Tool (for example: you miss debug information source), then you still can get useful information from code, but only if you have source code for exact the same version of your application. To do that:
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;load your application into IDE (restore it to previous version, if needed);&lt;/li&gt;
&lt;li&gt;launch it via Run/Run (F9) command;&lt;/li&gt;
&lt;li&gt;put your application on pause (Run/Pause);&lt;/li&gt;
&lt;li&gt;use Search/Go to address command;&lt;/li&gt;
&lt;li&gt;enter absolute address (don't forget to add '$' prefix) into dialog;&lt;/li&gt;
&lt;li&gt;click OK;&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-PDizqpNUwnQ/T2dTLXb4yuI/AAAAAAAADkM/Iq7lM_gwJaI/s1600/ManualSearch.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="400" src="http://3.bp.blogspot.com/-PDizqpNUwnQ/T2dTLXb4yuI/AAAAAAAADkM/Iq7lM_gwJaI/s400/ManualSearch.png" width="324" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Searching for address location manually (click to enlarge)&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
And you'll be moved to the source code location. If there is debug information available for that location - you will see source code in IDE code editor; otherwise you'll see a CPU debugger positioned to your location.&lt;br /&gt;
&lt;br /&gt;
You can download freeware EurekaLog Tools Pack &lt;a title="EurekaLog Downloads" href="http://www.eurekalog.com/downloads_delphi.php"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6789056281440007248-1735348158417745550?l=eurekalog.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=0tnuUHloTYw:TtKqLHbk8WE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=0tnuUHloTYw:TtKqLHbk8WE:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?i=0tnuUHloTYw:TtKqLHbk8WE:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=0tnuUHloTYw:TtKqLHbk8WE:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?i=0tnuUHloTYw:TtKqLHbk8WE:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=0tnuUHloTYw:TtKqLHbk8WE:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?i=0tnuUHloTYw:TtKqLHbk8WE:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=0tnuUHloTYw:TtKqLHbk8WE:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?i=0tnuUHloTYw:TtKqLHbk8WE:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=0tnuUHloTYw:TtKqLHbk8WE:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/EurekaLog/~4/0tnuUHloTYw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://eurekalog.blogspot.com/feeds/1735348158417745550/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://eurekalog.blogspot.com/2012/03/what-does-this-address-mean-introducing.html#comment-form" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6789056281440007248/posts/default/1735348158417745550?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6789056281440007248/posts/default/1735348158417745550?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/EurekaLog/~3/0tnuUHloTYw/what-does-this-address-mean-introducing.html" title="What does this address mean? (introducing Address Lookup Tool)" /><author><name>Александр Алексеев</name><uri>https://profiles.google.com/113168002104297556003</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-aUMttZQBsuI/AAAAAAAAAAI/AAAAAAAAC3Y/QuZ7K9t_WzE/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-pGOJV7NwMtw/T2c8oSiug-I/AAAAAAAADjo/KUGZFtVnIvk/s72-c/AddressLookup.png" height="72" width="72" /><thr:total>3</thr:total><feedburner:origLink>http://eurekalog.blogspot.com/2012/03/what-does-this-address-mean-introducing.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0YASH88fSp7ImA9WhVREUs.&quot;"><id>tag:blogger.com,1999:blog-6789056281440007248.post-2225279669788978659</id><published>2012-03-19T13:46:00.001Z</published><updated>2012-03-19T13:52:29.175Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-03-19T13:52:29.175Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Delphi" /><category scheme="http://www.blogger.com/atom/ns#" term="tools" /><category scheme="http://www.blogger.com/atom/ns#" term="EL 7.x" /><title>What does this error code mean? (introducing Error Lookup Tool)</title><content type="html">Did you ever encounter cryptic error messages like "Error -1073741819" or "Run-time error 216"? Have you wondered what this could be and how to find more meaningfull description of the error? Well, look no further...&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;h1&gt;Error Lookup Tool&lt;/h1&gt;
EurekaLog 7 as well as standalone EurekaLog Tools Pack have a Error Lookup Tool, which can help you to analyze different error codes and provide more information than contains in the code itself. You can launch this tool via Start menu (Programs\EurekaLog 7\Tools\Error Lookup) or via Tools\EurekaLog\Error Lookup IDE command (for EurekaLog 7 only, not applicable to Tools Pack).&lt;br /&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-7w7KuxNwEmo/T2cvfysQbgI/AAAAAAAADiY/WW--4QPVb-E/s1600/ErrLookup.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="254" src="http://1.bp.blogspot.com/-7w7KuxNwEmo/T2cvfysQbgI/AAAAAAAADiY/WW--4QPVb-E/s400/ErrLookup.png" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Error Lookup main window&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
As you can see - the interface is very simple. Just enter your mystic error code value into edit (don't forget to add '$' prefix for hex-codes) and hit "Lookup..." button:&lt;br /&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-E4wLpkfyjRw/T2cw-jz1bfI/AAAAAAAADik/JRM3I2acOKU/s1600/ErrLookupExample.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="180" src="http://1.bp.blogspot.com/-E4wLpkfyjRw/T2cw-jz1bfI/AAAAAAAADik/JRM3I2acOKU/s400/ErrLookupExample.png" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Error Lookup resolving&amp;nbsp;-1073741819 error code (click on image to enlarge)&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-lnQfZySLang/T2c3dLQOh1I/AAAAAAAADjc/ANb0IlGvAJQ/s1600/ErrLookupRunTime.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="186" src="http://4.bp.blogspot.com/-lnQfZySLang/T2c3dLQOh1I/AAAAAAAADjc/ANb0IlGvAJQ/s400/ErrLookupRunTime.png" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Error Lookup resolving 216 error code (click to enlarge)&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
So now you know that -1073741819 - is actually a system error code for access violation exception, and 216 is the same access violation, but now expressed via Delphi RTL run-time codes.&lt;br /&gt;
&lt;br /&gt;
Error Lookup supports many sources of error codes, for example:&lt;br /&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-uZxHiehMrzc/T2cxzMKwVMI/AAAAAAAADiw/75Qkn23NHNk/s1600/ErrLookupMulti.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="214" src="http://2.bp.blogspot.com/-uZxHiehMrzc/T2cxzMKwVMI/AAAAAAAADiw/75Qkn23NHNk/s400/ErrLookupMulti.png" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Illustrating more error sources (click to enlarge)&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
As you can see for some error codes there are multiply possible descriptions available. The correct interpretation depens on the code which generated that error code. Error Lookup can not know that, so it just displays all possible cases - and you'll need to pick the one matching the context of the error.&lt;br /&gt;
&lt;br /&gt;
The opposite case can also be true. You can get an error code, which is unrecognized by Error Lookup Tool. This can either be a custom error code or new standard error code. For example:&lt;br /&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-9NENwhHfLNk/T2czAdMk0VI/AAAAAAAADi8/-LAse02Tgaw/s1600/ErrLookupCustom.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="334" src="http://3.bp.blogspot.com/-9NENwhHfLNk/T2czAdMk0VI/AAAAAAAADi8/-LAse02Tgaw/s400/ErrLookupCustom.png" width="356" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Custom error code of HRESULT kind is displayed in Error Lookup&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
The correct interpretation of custom error codes depends on the component which returns that code. The same code means different things for different components. When you encounter such code you should refer/search documentation for the called code. Custom codes are applicable for Win32, NTSTATUS and HRESULT values. RTL, I/O, WinInet and other kinds of codes do not support custom codes extensions.&lt;br /&gt;
&lt;br /&gt;
Another case of unknown error code:&lt;br /&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-qgxG0Qm28ps/T2czyJYe4JI/AAAAAAAADjE/R6aLd-Rz3f8/s1600/ErrLookupUnknown.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-qgxG0Qm28ps/T2czyJYe4JI/AAAAAAAADjE/R6aLd-Rz3f8/s1600/ErrLookupUnknown.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Unknown error code do not display any additional information&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
If there is a new error code which is not known to Error Lookup Tool - it will show you no information at all. In this case we ask you to send us a notification about error code which is not covered by us, so we can improve our tools.&lt;br /&gt;
&lt;br /&gt;
You can also try to force-display all interpretation of any error code by marking "Show all" option before clicking on "Lookup..." button:&lt;br /&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-xRBRJ5ps3IU/T2c073FE1SI/AAAAAAAADjQ/GL6DPiDxUUo/s1600/ErrLookupFull.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="359" src="http://1.bp.blogspot.com/-xRBRJ5ps3IU/T2c073FE1SI/AAAAAAAADjQ/GL6DPiDxUUo/s400/ErrLookupFull.png" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Showing all possible interpretations of error code&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
This will display all interpretations of entered error code to you - regardless of if it's meaningfull at all.&lt;br /&gt;
&lt;br /&gt;
You can download freeware EurekaLog Tools Pack &lt;a title="EurekaLog Downloads" href="http://www.eurekalog.com/downloads_delphi.php"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6789056281440007248-2225279669788978659?l=eurekalog.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=4wpjpmYv5Z8:PRScWtHdWko:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=4wpjpmYv5Z8:PRScWtHdWko:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?i=4wpjpmYv5Z8:PRScWtHdWko:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=4wpjpmYv5Z8:PRScWtHdWko:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?i=4wpjpmYv5Z8:PRScWtHdWko:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=4wpjpmYv5Z8:PRScWtHdWko:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?i=4wpjpmYv5Z8:PRScWtHdWko:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=4wpjpmYv5Z8:PRScWtHdWko:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?i=4wpjpmYv5Z8:PRScWtHdWko:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=4wpjpmYv5Z8:PRScWtHdWko:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/EurekaLog/~4/4wpjpmYv5Z8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://eurekalog.blogspot.com/feeds/2225279669788978659/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://eurekalog.blogspot.com/2012/03/what-does-this-error-code-mean.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6789056281440007248/posts/default/2225279669788978659?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6789056281440007248/posts/default/2225279669788978659?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/EurekaLog/~3/4wpjpmYv5Z8/what-does-this-error-code-mean.html" title="What does this error code mean? (introducing Error Lookup Tool)" /><author><name>Александр Алексеев</name><uri>https://profiles.google.com/113168002104297556003</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-aUMttZQBsuI/AAAAAAAAAAI/AAAAAAAAC3Y/QuZ7K9t_WzE/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-7w7KuxNwEmo/T2cvfysQbgI/AAAAAAAADiY/WW--4QPVb-E/s72-c/ErrLookup.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://eurekalog.blogspot.com/2012/03/what-does-this-error-code-mean.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkUDRHw9fyp7ImA9WhVSFks.&quot;"><id>tag:blogger.com,1999:blog-6789056281440007248.post-6984812055754836229</id><published>2012-03-13T19:51:00.001Z</published><updated>2012-03-13T19:51:15.267Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-03-13T19:51:15.267Z</app:edited><title>EurekaLog RC 3 (public Win64 test release)</title><content type="html">We've just released EurekaLog 7 RC 3.&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;div style="text-align: center;"&gt;
&lt;a href="http://www.eurekalog.com/" target="_blank" title="EurekaLog Logo"&gt;&lt;img alt="EurekaLog Logo" height="68" src="http://www.eurekalog.com/images/logo.png" width="295" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
We are pleased to announce the availability of the new EurekaLog 7.0.0.194 version (RC 3). The main addition for RC 3 is first public access to &lt;b&gt;Win64 support in EurekaLog&lt;/b&gt;. You can &lt;a href="http://www.eurekalog.com/downloads_delphi.php" title="EurekaLog Downloads"&gt;download and install EurekaLog 7 RC 3&lt;/a&gt; to try EurekaLog for Win64. For more information about installing a beta - see &lt;a href="http://eurekalog.blogspot.com/2011/12/announcing-public-eurekalog-7-beta.html" title="Announcing public EurekaLog 7 beta"&gt;here&lt;/a&gt;. For installing both EurekaLog 6 and EurekaLog 7 on the same machine - see &lt;a href="http://eurekalog.blogspot.com/2011/12/using-eurekalog-6-and-eurekalog-7-on.html" title="Using EurekaLog 6 and EurekaLog 7 on the same machine and/or in the same IDE version"&gt;here&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Note:&lt;/b&gt; this is a beta version. Each application compiled with beta will expired after 30 days. Do not use it for production.&lt;br /&gt;
&lt;br /&gt;
&lt;h1&gt;EurekaLog for Win64 quick walktrough&lt;/h1&gt;
Create new project and right-click on "Platforms" node in project manager:&lt;br /&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-PSDkH_inE6o/T1-hD6BoPTI/AAAAAAAADgQ/2hUAdtTQpRc/s1600/EL64_1.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-PSDkH_inE6o/T1-hD6BoPTI/AAAAAAAADgQ/2hUAdtTQpRc/s1600/EL64_1.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Platforms context menu&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
Click on "Add platform..." command and you'll see adding platform dialog:&lt;br /&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-ZnUHdesPqX8/T1-hRbHOmBI/AAAAAAAADgY/A-EkQ48x1fs/s1600/EL64_2.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-ZnUHdesPqX8/T1-hRbHOmBI/AAAAAAAADgY/A-EkQ48x1fs/s1600/EL64_2.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Adding new platform to project&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
Select "64-bit Windows", check "Make the selected platform active" option and click OK.&lt;br /&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-YWVu2YZDkhg/T1-hfUrT-3I/AAAAAAAADgg/zGTmVwnKdJ8/s1600/EL64_3.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-YWVu2YZDkhg/T1-hfUrT-3I/AAAAAAAADgg/zGTmVwnKdJ8/s1600/EL64_3.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Project configured for Win64&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
Now to go Project/EurekaLog project options:&lt;br /&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/--WXnccZzXmo/T1-hrWLT4BI/AAAAAAAADgo/5Xjy6duuddA/s1600/EL64_4.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="400" src="http://1.bp.blogspot.com/--WXnccZzXmo/T1-hrWLT4BI/AAAAAAAADgo/5Xjy6duuddA/s400/EL64_4.png" width="183" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;EurekaLog project options under Project menu (image is clickable)&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
Check "Activate EurekaLog" option and select type of your application (usually - VCL Forms):&lt;br /&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-qAHLZN46ahk/T1-h74_OOMI/AAAAAAAADgw/aABpswstPE8/s1600/EL64_5.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="295" src="http://4.bp.blogspot.com/-qAHLZN46ahk/T1-h74_OOMI/AAAAAAAADgw/aABpswstPE8/s400/EL64_5.png" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Enabling EurekaLog for the project (click to enlarge/zoom in)&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
Now, build your project. If you have enabled visual feedback - you should see EurekaLog-processing stage at the end of the build process:&lt;br /&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-XRbSWlw8ctQ/T1-iR2oRxfI/AAAAAAAADg4/vivvYn9bcyw/s1600/EL64_6.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-XRbSWlw8ctQ/T1-iR2oRxfI/AAAAAAAADg4/vivvYn9bcyw/s1600/EL64_6.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;EurekaLog processes your project&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
Run your project and try to do something bad. In my example I'll just do:&lt;br /&gt;
&lt;pre class="brush:delphi"&gt;raise Exception.Create('Error Message');&lt;/pre&gt;
in the OnClick event of the button.&lt;br /&gt;
&lt;br /&gt;
So, when I click on the button - I get usual EurekaLog error dialog:&lt;br /&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-H35ShX82iUk/T1-ixReRddI/AAAAAAAADhA/bcpPExbg7_k/s1600/EL64_7.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-H35ShX82iUk/T1-ixReRddI/AAAAAAAADhA/bcpPExbg7_k/s1600/EL64_7.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Win64 MS Classic Error Dialog&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
You can click on "click here" link to see detailed report:&lt;br /&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-OqDJ_jbnQnY/T1-i-gJxqqI/AAAAAAAADhI/eY_Ohyttnqk/s1600/EL64_8.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="331" src="http://4.bp.blogspot.com/-OqDJ_jbnQnY/T1-i-gJxqqI/AAAAAAAADhI/eY_Ohyttnqk/s400/EL64_8.png" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;64-bit call stack (click to zoom in/enlarge)&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-C75TLxKGJYQ/T1-jIurSSBI/AAAAAAAADhQ/vC_SF8ke1Ds/s1600/EL64_9.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="262" src="http://1.bp.blogspot.com/-C75TLxKGJYQ/T1-jIurSSBI/AAAAAAAADhQ/vC_SF8ke1Ds/s400/EL64_9.png" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;64-bit CPU view (click to&amp;nbsp;
enlarge/zoom in)&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
So, that's it!&lt;br /&gt;
&lt;br /&gt;
&lt;h1&gt;Win64 support status&lt;/h1&gt;
Basically, EurekaLog for Win64 is very similar to EurekaLog for Win32 with few exceptions:
&lt;ul&gt;
&lt;li&gt;Not all options are applicable for Win64 (for example, stack tracing method option is ignored).&lt;/li&gt; 
&lt;li&gt;Win64 disassembler is not ready.&lt;/li&gt; 
&lt;li&gt;EurekaLog for Win32 and EurekaLog for Win64 may behave slightly different - due to difference in exception processing on Win32/Win64.&lt;/li&gt; 
&lt;/ul&gt;
&lt;br /&gt;
It's also highly recommended to use the latest Delphi XE2 update pack for EurekaLog 7 RC 3.&lt;br /&gt;
&lt;br /&gt;
&lt;h1&gt;EurekaLog Tools Pack&lt;/h1&gt;
EurekaLog Tools Pack was also updated with Win64 counter-equivalents of some tools which depends on bitness (module analyzer, threads snapshot, etc) - while most tools still has only 32-bit version. 64-bit EurekaLog Tools are also included into EurekaLog 7 RC 3.&lt;br /&gt; 
&lt;br /&gt;
Please note that 64-bit executables will only be installed on 64-bit system. On the other hand, Win64 support in EurekaLog can be installed on any system - 32-bit and 64-bit.&lt;br /&gt;
&lt;br /&gt;
&lt;h1&gt;Conclusion&lt;/h1&gt;
We're waiting on your feedback. Tell us what you think!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6789056281440007248-6984812055754836229?l=eurekalog.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=Oh2KZ_0pPPg:-39AYOH9iXs:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=Oh2KZ_0pPPg:-39AYOH9iXs:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?i=Oh2KZ_0pPPg:-39AYOH9iXs:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=Oh2KZ_0pPPg:-39AYOH9iXs:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?i=Oh2KZ_0pPPg:-39AYOH9iXs:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=Oh2KZ_0pPPg:-39AYOH9iXs:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?i=Oh2KZ_0pPPg:-39AYOH9iXs:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=Oh2KZ_0pPPg:-39AYOH9iXs:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?i=Oh2KZ_0pPPg:-39AYOH9iXs:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=Oh2KZ_0pPPg:-39AYOH9iXs:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/EurekaLog/~4/Oh2KZ_0pPPg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://eurekalog.blogspot.com/feeds/6984812055754836229/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://eurekalog.blogspot.com/2012/03/eurekalog-rc-3-public-win64-test.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6789056281440007248/posts/default/6984812055754836229?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6789056281440007248/posts/default/6984812055754836229?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/EurekaLog/~3/Oh2KZ_0pPPg/eurekalog-rc-3-public-win64-test.html" title="EurekaLog RC 3 (public Win64 test release)" /><author><name>Александр Алексеев</name><uri>https://profiles.google.com/113168002104297556003</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-aUMttZQBsuI/AAAAAAAAAAI/AAAAAAAAC3Y/QuZ7K9t_WzE/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-PSDkH_inE6o/T1-hD6BoPTI/AAAAAAAADgQ/2hUAdtTQpRc/s72-c/EL64_1.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://eurekalog.blogspot.com/2012/03/eurekalog-rc-3-public-win64-test.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0UBSXg8fip7ImA9WhVQF00.&quot;"><id>tag:blogger.com,1999:blog-6789056281440007248.post-1336882636123250136</id><published>2012-01-25T00:26:00.001Z</published><updated>2012-04-06T11:47:38.676+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-04-06T11:47:38.676+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Delphi" /><category scheme="http://www.blogger.com/atom/ns#" term="OSX" /><category scheme="http://www.blogger.com/atom/ns#" term="Win64" /><category scheme="http://www.blogger.com/atom/ns#" term="EL 7.x" /><category scheme="http://www.blogger.com/atom/ns#" term="feature" /><category scheme="http://www.blogger.com/atom/ns#" term="Random thoughts" /><title>EurekaLog and FireMonkey / Win64 / OSX</title><content type="html">Clarification about EurekaLog and latest Delphi versions...&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
Delphi XE2 has introduced a new visual framework - FireMonkey, as well as support for more platforms, including Win64 and OSX.&lt;br /&gt;
&lt;br /&gt;
There are constant income of questions about EurekaLog's future and possible support for these new technlogies. So I've decided to publish general explanation for everyone.&lt;br /&gt;
&lt;br /&gt;
&lt;h1&gt;
EurekaLog and FireMonkey&lt;/h1&gt;
The answer is simple - EurekaLog will... never support FireMonkey, because there is nothing to support! FireMonkey is visual framework. But EurekaLog just don't use any visual frameworks - it don't use VCL and it certainly don't need to use FireMonkey. EurekaLog uses API for all visual UI.&lt;br /&gt;
&lt;br /&gt;
That's why &lt;b&gt;you already can use EurekaLog with both VCL and FireMonkey applications&lt;/b&gt;.&lt;br /&gt;
&lt;br /&gt;
Of course, if you want to create your own custom error dialogs for EurekaLog or something like that - fine, use API, VCL, FireMonkey or whatever technology else. There is no limitations. However, EurekaLog is not related to VCL or FireMonkey. It's just exception tracer.&lt;br /&gt;
&lt;br /&gt;
&lt;h1&gt;
EurekaLog and Win64&lt;/h1&gt;
Sorry, but EurekaLog 6 will never support Win64. It was written without considering other platforms in mind.&lt;br /&gt;
&lt;br /&gt;
However, there are good news: EurekaLog 7 will support Win64. Right now we're working on it, even though it dind't appear in any public releases. &lt;b&gt;Support for Win64 is our current top priority!&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
It's expected that Win64 support will be released (as beta) after we ship stable release of EurekaLog 7. You can help this to happen sooner by testing EurekaLog.&lt;br /&gt;
&lt;br /&gt;
Preleminary estimate is that Win64 support will be basic for first few releases and then we'll add advanced features (like disassembler view).&lt;br /&gt;
&lt;br /&gt;
Another good news is that we want to make migration process as painless as possible. Ideally you should be able to install EurekaLog 7, open your old project, recompile it - and it should work.&lt;br /&gt;
&lt;br /&gt;
&lt;h1&gt;
EurekaLog and OSX&lt;/h1&gt;
The case with OSX support is very similar to Win64. EurekaLog 6 is out of question, but support for OSX is planned for EurekaLog 7. This is our second top-priority.&lt;br /&gt;
&lt;br /&gt;
We want to finish Win64 first and then start going for OSX. Currently, there was no work done for OSX, but all current work is done with future OSX target in mind.&lt;br /&gt;
&lt;br /&gt;
&lt;h1&gt;
EurekaLog and... Lazarus/MSVS C++&lt;/h1&gt;
Yes, there is slight possibility for appearing EurekaLog for other IDEs like Lazarus or Microsoft Visual Studio (C++). However, currently this is considered as low-priority in far-far away future.&lt;br /&gt;
&lt;br /&gt;
Note: this information is highly preliminary and is suject to change. Also, there is no estimates available.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6789056281440007248-1336882636123250136?l=eurekalog.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=JzN2vIvlFsg:HUUA47h8C_s:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=JzN2vIvlFsg:HUUA47h8C_s:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?i=JzN2vIvlFsg:HUUA47h8C_s:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=JzN2vIvlFsg:HUUA47h8C_s:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?i=JzN2vIvlFsg:HUUA47h8C_s:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=JzN2vIvlFsg:HUUA47h8C_s:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?i=JzN2vIvlFsg:HUUA47h8C_s:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=JzN2vIvlFsg:HUUA47h8C_s:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?i=JzN2vIvlFsg:HUUA47h8C_s:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=JzN2vIvlFsg:HUUA47h8C_s:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/EurekaLog/~4/JzN2vIvlFsg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://eurekalog.blogspot.com/feeds/1336882636123250136/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://eurekalog.blogspot.com/2012/01/eurekalog-and-firemonkeywin64osx.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6789056281440007248/posts/default/1336882636123250136?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6789056281440007248/posts/default/1336882636123250136?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/EurekaLog/~3/JzN2vIvlFsg/eurekalog-and-firemonkeywin64osx.html" title="EurekaLog and FireMonkey / Win64 / OSX" /><author><name>Александр Алексеев</name><uri>https://profiles.google.com/113168002104297556003</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-aUMttZQBsuI/AAAAAAAAAAI/AAAAAAAAC3Y/QuZ7K9t_WzE/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://eurekalog.blogspot.com/2012/01/eurekalog-and-firemonkeywin64osx.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkcGRn49eip7ImA9WhRUFEg.&quot;"><id>tag:blogger.com,1999:blog-6789056281440007248.post-172075982702595019</id><published>2012-01-25T00:07:00.001Z</published><updated>2012-01-25T00:07:07.062Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-25T00:07:07.062Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Delphi" /><category scheme="http://www.blogger.com/atom/ns#" term="EL 7.x" /><category scheme="http://www.blogger.com/atom/ns#" term="Releases" /><title>EurekaLog 7 RC 2</title><content type="html">We've just released EurekaLog 7 RC 2.&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
We fixed all found issues (thanks to all beta-testers!) and make some improvements and additions. A new beta is available for download from &lt;a title="EurekaLog Downloads" href="http://www.eurekalog.com/downloads_delphi.php"&gt;our web-site&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
EurekaLog 7 Tools Pack was also updated to the latest version (one additional tool was added).&lt;br /&gt;
&lt;br /&gt;
We recommend to manually uninstall any previous beta or previews of EurekaLog 7 or EurekaLog Tools Pack before installing EurekaLog 7 RC 2 or updated EurekaLog Tools Pack. After installation - you can re-activate EurekaLog 6 or EurekaLog 7 via Start/Programs/EurekaLog 7/Manage menu item.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6789056281440007248-172075982702595019?l=eurekalog.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=_9u346zTGzk:oFSx2eb-Ptk:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=_9u346zTGzk:oFSx2eb-Ptk:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?i=_9u346zTGzk:oFSx2eb-Ptk:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=_9u346zTGzk:oFSx2eb-Ptk:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?i=_9u346zTGzk:oFSx2eb-Ptk:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=_9u346zTGzk:oFSx2eb-Ptk:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?i=_9u346zTGzk:oFSx2eb-Ptk:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=_9u346zTGzk:oFSx2eb-Ptk:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?i=_9u346zTGzk:oFSx2eb-Ptk:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=_9u346zTGzk:oFSx2eb-Ptk:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/EurekaLog/~4/_9u346zTGzk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://eurekalog.blogspot.com/feeds/172075982702595019/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://eurekalog.blogspot.com/2012/01/eurekalog-7-rc-2.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6789056281440007248/posts/default/172075982702595019?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6789056281440007248/posts/default/172075982702595019?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/EurekaLog/~3/_9u346zTGzk/eurekalog-7-rc-2.html" title="EurekaLog 7 RC 2" /><author><name>Александр Алексеев</name><uri>https://profiles.google.com/113168002104297556003</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-aUMttZQBsuI/AAAAAAAAAAI/AAAAAAAAC3Y/QuZ7K9t_WzE/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://eurekalog.blogspot.com/2012/01/eurekalog-7-rc-2.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkIGR3cyeip7ImA9WhRVGUQ.&quot;"><id>tag:blogger.com,1999:blog-6789056281440007248.post-6981052668896142571</id><published>2012-01-19T17:35:00.001Z</published><updated>2012-01-19T17:35:26.992Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-19T17:35:26.992Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Delphi" /><category scheme="http://www.blogger.com/atom/ns#" term="EL 6.x" /><category scheme="http://www.blogger.com/atom/ns#" term="Releases" /><title>EurekaLog 6.1.04 is out</title><content type="html">We are pleased to announce the availability of the new 6.1.04 version.&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;div style="text-align: center;"&gt;
&lt;a href="http://www.eurekalog.com/" target="_blank" title="EurekaLog Logo"&gt;&lt;img alt="EurekaLog Logo" height="68" src="http://www.eurekalog.com/images/logo.png" width="295" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;blockquote&gt;
EurekaLog is a tool for Delphi and C++Builder that gives your application the power to catch every exception and memory leak, generating a detailed log of the call stack (with unit, procedure and line number), optionally sending you a copy of each log entry via email or the Web via the most used Web Bug-Tracking tools (as Mantis, BugZilla and FogBugz).&lt;/blockquote&gt;
EurekaLog represents the most advanced exception and memory leaks logger technology available for Delphi/C++Builder developers.&lt;br /&gt;
&lt;br /&gt;
To learn more about EurekaLog, please visit our website at:&lt;br /&gt;
&lt;a href="http://www.eurekalog.com/" target="_blank" title="http://www.eurekalog.com"&gt;http://www.eurekalog.com&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
To download a demo, please visit:&lt;br /&gt;
&lt;a href="http://www.eurekalog.com/downloads.php" target="_blank" title="http://www.eurekalog.com/downloads.php"&gt;http://www.eurekalog.com/downloads.php&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
If you would like to purchase a new license, please visit:&lt;br /&gt;
&lt;a href="http://www.eurekalog.com/buy.php" target="_blank" title="http://www.eurekalog.com/buy.php"&gt;http://www.eurekalog.com/buy.php&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;&lt;br /&gt;Upgrade policy:&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
If you would like to purchase an upgrade, this is our upgrade discount policy:&lt;br /&gt;
&lt;br /&gt;
1)...upgrade from any 4.x or 5.x to any 6.x - 50% discount;&lt;br /&gt;
2)...upgrade from a 6.x license type to another (ex: from a "Single Professional" to a "Corporate Professional") - the price difference.&lt;br /&gt;
&lt;br /&gt;
NOTE: the upgrade from an old 6.x version to the last released version is full free.&lt;br /&gt;
&lt;br /&gt;
Buy your upgrade or download your full version here:&lt;br /&gt;
&lt;a href="http://www.eurekalog.com/login.php" target="_blank" title="http://www.eurekalog.com/login.php"&gt;http://www.eurekalog.com/login.php&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;&lt;br /&gt;Changes:&lt;/strong&gt;&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;Added: support for MainSource in dproj files&lt;/li&gt;
&lt;li&gt;Fixed: compatibility issues with RAD Studio XE2 Update 3&lt;/li&gt;
&lt;li&gt;Fixed: unexpected dialog behaviour in unattended enviroments&lt;/li&gt;
&lt;li&gt;Fixed: some complex C++ Builder's idents were not recornized by Viewer&lt;/li&gt;
&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6789056281440007248-6981052668896142571?l=eurekalog.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=LMl6t4g5epg:X7ocll5Eajo:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=LMl6t4g5epg:X7ocll5Eajo:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?i=LMl6t4g5epg:X7ocll5Eajo:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=LMl6t4g5epg:X7ocll5Eajo:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?i=LMl6t4g5epg:X7ocll5Eajo:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=LMl6t4g5epg:X7ocll5Eajo:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?i=LMl6t4g5epg:X7ocll5Eajo:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=LMl6t4g5epg:X7ocll5Eajo:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?i=LMl6t4g5epg:X7ocll5Eajo:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=LMl6t4g5epg:X7ocll5Eajo:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/EurekaLog/~4/LMl6t4g5epg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://eurekalog.blogspot.com/feeds/6981052668896142571/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://eurekalog.blogspot.com/2012/01/eurekalog-6104-is-out.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6789056281440007248/posts/default/6981052668896142571?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6789056281440007248/posts/default/6981052668896142571?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/EurekaLog/~3/LMl6t4g5epg/eurekalog-6104-is-out.html" title="EurekaLog 6.1.04 is out" /><author><name>Александр Алексеев</name><uri>https://profiles.google.com/113168002104297556003</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-aUMttZQBsuI/AAAAAAAAAAI/AAAAAAAAC3Y/QuZ7K9t_WzE/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://eurekalog.blogspot.com/2012/01/eurekalog-6104-is-out.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUQHQXcycCp7ImA9WhRXE08.&quot;"><id>tag:blogger.com,1999:blog-6789056281440007248.post-9008279881237843663</id><published>2011-12-19T20:42:00.000Z</published><updated>2011-12-19T20:42:10.998Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-19T20:42:10.998Z</app:edited><title>EurekaLog Users Survey</title><content type="html">We would like to invite you to participate into EurekaLog Customers Survey.&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
This short survey will take only about 10 minutes of your valuable time and will greatly help us to define EurekaLog's future. This survey is for all (actual and potential) EurekaLog users. Don't feel shy to share your opinion!&lt;br /&gt;
&lt;br /&gt;
&lt;a href="https://www.kwiksurveys.com?s=NIMIOF_2f187147" title="EurekaLog Feedback Survey"&gt;Take a survey&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6789056281440007248-9008279881237843663?l=eurekalog.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=U7hCzUDGNmY:k9iJt3ItvjE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=U7hCzUDGNmY:k9iJt3ItvjE:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?i=U7hCzUDGNmY:k9iJt3ItvjE:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=U7hCzUDGNmY:k9iJt3ItvjE:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?i=U7hCzUDGNmY:k9iJt3ItvjE:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=U7hCzUDGNmY:k9iJt3ItvjE:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?i=U7hCzUDGNmY:k9iJt3ItvjE:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=U7hCzUDGNmY:k9iJt3ItvjE:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?i=U7hCzUDGNmY:k9iJt3ItvjE:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=U7hCzUDGNmY:k9iJt3ItvjE:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/EurekaLog/~4/U7hCzUDGNmY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://eurekalog.blogspot.com/feeds/9008279881237843663/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://eurekalog.blogspot.com/2011/12/eurekalog-users-survey.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6789056281440007248/posts/default/9008279881237843663?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6789056281440007248/posts/default/9008279881237843663?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/EurekaLog/~3/U7hCzUDGNmY/eurekalog-users-survey.html" title="EurekaLog Users Survey" /><author><name>Александр Алексеев</name><uri>https://profiles.google.com/113168002104297556003</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-aUMttZQBsuI/AAAAAAAAAAI/AAAAAAAAC3Y/QuZ7K9t_WzE/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://eurekalog.blogspot.com/2011/12/eurekalog-users-survey.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ck8BQn0yfCp7ImA9WhRXE04.&quot;"><id>tag:blogger.com,1999:blog-6789056281440007248.post-5682009562734093740</id><published>2011-12-19T20:35:00.000Z</published><updated>2011-12-19T21:40:53.394Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-19T21:40:53.394Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Delphi" /><category scheme="http://www.blogger.com/atom/ns#" term="non-technical" /><category scheme="http://www.blogger.com/atom/ns#" term="EL 7.x" /><category scheme="http://www.blogger.com/atom/ns#" term="Releases" /><title>Announcing public EurekaLog 7 beta</title><content type="html">Get a free EurekaLog 7 license! ;)&lt;br /&gt;
&lt;br /&gt;
We are pleased to announce the availability of the first EurekaLog 7 public beta.&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
You can download it from &lt;a href="http://www.eurekalog.com/downloads_delphi.php" title="EurekaLog Delphi Downloads"&gt;"Delphi downloads"&lt;/a&gt; on our web-site.&lt;br /&gt;
&lt;br /&gt;
We also would like to invite you to participate into EurekaLog User Survey, which you can take &lt;a href="https://www.kwiksurveys.com/?s=NIMIOF_2f187147" title="EurekaLog Feedback Survey"&gt;here&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;h1&gt;
How to try EurekaLog 7&lt;/h1&gt;
EurekaLog 7 can be installed with EurekaLog 6. You can switch between EurekaLog's versions by using new "Manage" menu item in Start Menu/Programs. &lt;br /&gt;
&lt;br /&gt;
You can find more information &lt;a href="http://eurekalog.blogspot.com/2011/12/using-eurekalog-6-and-eurekalog-7-on.html" title="Using EurekaLog 6 and EurekaLog 7 on the same machine and/or in the same IDE version"&gt;here&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;h1&gt;
Differences with EurekaLog 6&lt;/h1&gt;
EurekaLog 7 is similar to EurekaLog 6. The only important difference for quick start - is that you need to &lt;a href="http://www.eurekalog.com/help/eurekalog/selecting_application_type.php" title="Selecting application type"&gt;select your application type&lt;/a&gt; after activating EurekaLog in your projects.&lt;br /&gt;
&lt;br /&gt;
Please, look though &lt;a href="http://www.eurekalog.com/help/eurekalog/tutorials.php" title="EurekaLog 7 Quick Start Tutorials"&gt;Quick Start Tutorials&lt;/a&gt; guide to quickly learn about changes.&lt;br /&gt;
&lt;br /&gt;
&lt;h1&gt;
EurekaLog 7 and exising EurekaLog 6-projects&lt;/h1&gt;
EurekaLog 7 changes some behaviour and introduces new features. In order to keep backward compatibility we decided to add so-called "EurekaLog 6 Compatibility Mode". You can access it in EurekaLog project options on &lt;a href="http://www.eurekalog.com/help/eurekalog/general_page.php" title="General tab in options"&gt;"General" tab&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
The idea is when you open old project - it will be opened (imported) in "EurekaLog 6 Compatibility Mode". When you create new project - it will be created with "EurekaLog 6 Compatibility Mode" turned off. When "EurekaLog 6 Compatibility Mode" is turned on - the EurekaLog behaviour will be the same as EurekaLog 6, so you would not need to change anything in your old existing projects!&lt;br /&gt;
&lt;br /&gt;
&lt;h1&gt;
Where to get information&lt;/h1&gt;
EurekaLog 7 has much more detailed help than EurekaLog 6. However, we're still writing it. Help can be accessed localy (via Start Menu or via F1 key in EurekaLog's windows) or &lt;a href="http://www.eurekalog.com/help/eurekalog/" title="EurekaLog 7 Documentation"&gt;Online&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Code reference is under construction, but you can find header files in &lt;code&gt;\Source&lt;/code&gt; sub-folder of your EurekaLog 7 installation (it's &lt;code&gt;C:\Program Files (x86)\EurekaLab\EurekaLog 7\Source\&lt;/code&gt; by default). Full source code will be available only for Enterprise edition of EurekaLog, but any edition has partial source code available!&lt;br /&gt;
&lt;br /&gt;
We also plan to start publising blog articles about new and extended EurekaLog 7 features and typical use cases. Stay tuned for more info!&lt;br /&gt;
&lt;br /&gt;
You can find list of changes in EurekaLog 7 &lt;a href="http://www.eurekalog.com/help/eurekalog/whats_new.php" title="What's new in EurekaLog 7"&gt;here&lt;/a&gt; (list is not complete yet!).&lt;br /&gt;
&lt;br /&gt;
&lt;h1&gt;
Participate in beta - win EurekaLog license!&lt;/h1&gt;
We would like to reward you for participating in EurekaLog 7 beta testing. Most active beta testers will receive a &lt;b&gt;free&lt;/b&gt; EurekaLog 7 Enterprise license! (and possibly other editions - as consolation prize) This applies to both existing customers and even non-EurekaLog users.&lt;br /&gt;
&lt;br /&gt;
What you need to do? Just install EurekaLog 7 and try to use it. Report any bug you found. Or just share opinion and feedback. Or make a code contribution. The more information you submit - the higher are chances to win licenses.&lt;br /&gt;
&lt;br /&gt;
How to submit an information? You can either use build-in feedback sending methods or use &lt;a href="http://support.eurekalog.com/index.php?/Tickets/Submit" title="EurekaLog Support"&gt;tech-support form&lt;/a&gt;. Be sure to use single e-mail address for all of your submissions. If you win - your EurekaLog license will be registered for that e-mail address. Please, don't use forums for that. Don't send your messages directly to the staff. Basically, if you got auto-responce message from our support system for your message - then it is registered for this offer.&lt;br /&gt;
&lt;br /&gt;
Winners will be announced after releasing EurekaLog 7 stable. Amount of winners is not fixed and will be decided based on actual number of active beta-testers. The winners will be determinated by most useful contribution into EurekaLog's developing. The exact measure of usefulness is left for us to decide. One good detailed report can be more useful than few short reports (however, this doesn't mean that you need to write multi-page-so-long-to-read-boring-reports). We retain rights to change conditions of this offer.&lt;br /&gt;
&lt;br /&gt;
If you will not win the license - then you still will be able to upgrade your existing EurekaLog license with 50% discount (or even for free, if you have buyed the license in the last 90 days before the release date of EurekaLog 7 stable).&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Note:&lt;/b&gt; EurekaLog 7 release date is not set. EurekaLog 7 will be released, when it'll be ready. You can help us to release it faster by testing it.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Note:&lt;/b&gt; the only EurekaLog 7 edition available now is Trial (which you can &lt;a title="EurekaLog Downloads" href="http://www.eurekalog.com/downloads_delphi.php"&gt;download from our web-site&lt;/a&gt;). Other editions (like Professional and Enterprise) will only be accessible after releasing EurekaLog 7 stable.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style="color: red;"&gt;Warning:&lt;/span&gt;&lt;/b&gt; this is first beta of EurekaLog. We strongly do not recomend to use it for real-life production projects.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6789056281440007248-5682009562734093740?l=eurekalog.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=7XUmwyVJA3Q:Q639jcbBq7Q:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=7XUmwyVJA3Q:Q639jcbBq7Q:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?i=7XUmwyVJA3Q:Q639jcbBq7Q:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=7XUmwyVJA3Q:Q639jcbBq7Q:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?i=7XUmwyVJA3Q:Q639jcbBq7Q:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=7XUmwyVJA3Q:Q639jcbBq7Q:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?i=7XUmwyVJA3Q:Q639jcbBq7Q:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=7XUmwyVJA3Q:Q639jcbBq7Q:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?i=7XUmwyVJA3Q:Q639jcbBq7Q:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=7XUmwyVJA3Q:Q639jcbBq7Q:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/EurekaLog/~4/7XUmwyVJA3Q" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://eurekalog.blogspot.com/feeds/5682009562734093740/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://eurekalog.blogspot.com/2011/12/announcing-public-eurekalog-7-beta.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6789056281440007248/posts/default/5682009562734093740?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6789056281440007248/posts/default/5682009562734093740?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/EurekaLog/~3/7XUmwyVJA3Q/announcing-public-eurekalog-7-beta.html" title="Announcing public EurekaLog 7 beta" /><author><name>Александр Алексеев</name><uri>https://profiles.google.com/113168002104297556003</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-aUMttZQBsuI/AAAAAAAAAAI/AAAAAAAAC3Y/QuZ7K9t_WzE/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://eurekalog.blogspot.com/2011/12/announcing-public-eurekalog-7-beta.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ak4NRXczfCp7ImA9WhRXE08.&quot;"><id>tag:blogger.com,1999:blog-6789056281440007248.post-9088205520759504423</id><published>2011-12-19T20:00:00.002Z</published><updated>2011-12-19T21:09:54.984Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-19T21:09:54.984Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Delphi" /><category scheme="http://www.blogger.com/atom/ns#" term="EL 7.x" /><category scheme="http://www.blogger.com/atom/ns#" term="EL 6.x" /><title>Using EurekaLog 6 and EurekaLog 7 on the same machine and/or in the same IDE version</title><content type="html">If you want to try EurekaLog 7, but can't abandon EurekaLog 6 yet (because you use it in your projects) - you can install them both.&lt;br /&gt;
&lt;br /&gt;
&lt;h1&gt;Summary&lt;/h1&gt;
To put this short:
&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;Install EurekaLog 6&lt;/li&gt;
&lt;li&gt;Install EurekaLog 7&lt;/li&gt;
&lt;li&gt;Use "Manage" Start menu item to switch between EurekaLog 6 and 7&lt;/li&gt;
&lt;/ol&gt;
&lt;b&gt;Warning:&lt;/b&gt; only EurekaLog 6.1.x is supported for parallel installation with EurekaLog 7. Old EurekaLog 6.0.x will not work.&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;h1&gt;Detailed explanation&lt;/h1&gt;
If you want to install two versions of EurekaLog on the same machine, you need to install them one after one, starting with older version. So, first you need to install EurekaLog 6 (well, right now you probably already have it installed).&lt;br /&gt;
&lt;br /&gt;
In the next step you should install EurekaLog 7. Since you have EurekaLog 6 installed, you will get such warning:&lt;br /&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-uckCzfib-UM/Tu-BpwPYtmI/AAAAAAAADBs/Kjim1lAUoUg/s1600/EL7Warning.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="270" src="http://1.bp.blogspot.com/-uckCzfib-UM/Tu-BpwPYtmI/AAAAAAAADBs/Kjim1lAUoUg/s400/EL7Warning.png" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;EurekaLog 7 has detected installed EurekaLog 6&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
You should answer "No", if you want to have both EurekaLog's versions installed (i.e. EurekaLog 6 and 7). If you answer "Yes", then EurekaLog 6 will be removed and EurekaLog 7 will be installed. This message will not appear, if you don't have EurekaLog 6 installed.&lt;br /&gt;
&lt;br /&gt;
The rest of the installation process is similar to EurekaLog 6 with few exceptions:&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;EurekaLog 6 will refuse to install, if there is already another version of EurekaLog installed. That's why you must install EurekaLog 6 first.&lt;/li&gt;
&lt;li&gt;EurekaLog 7 will install itself into another folder. By default, the installation path is:
&lt;ul&gt;
&lt;li&gt;EurekaLog 6: &lt;code&gt;C:\Program Files (x86)\EurekaLab\EurekaLog 6\&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;EurekaLog 7: &lt;code&gt;C:\Program Files (x86)\EurekaLab\EurekaLog 7\&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
("(x86)" is removed for 32-bit Windows).&lt;/li&gt;
&lt;li&gt;EurekaLog 7 doesn't support Delphi 3 for technical reasons.&lt;/li&gt;
&lt;li&gt;EurekaLog 6 installer comes with English language only. EurekaLog 7 installer has different languages available.&lt;/li&gt;
&lt;li&gt;EurekaLog 7 installer offers more install options. Notable, EurekaLog 7 includes more tools as well as partial source code (for non-source code editions).&lt;/li&gt;
&lt;li&gt;EurekaLog 7 offers a separate "Register EurekaLog into IDE" option.&lt;/li&gt;
&lt;/ol&gt;
Basically, you should see a set of checkboxes for each of your installed IDE (like "Delphi 7" or "C++ Builder XE2"):&lt;br /&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-sfDLeTkOeUE/Tu-A9vqbbjI/AAAAAAAADBg/GL55kEZrAgQ/s1600/EL6IDEs.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="326" src="http://3.bp.blogspot.com/-sfDLeTkOeUE/Tu-A9vqbbjI/AAAAAAAADBg/GL55kEZrAgQ/s400/EL6IDEs.png" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;IDE selection in EurekaLog 6 installer&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
Each of such checkboxes installs support files for selected IDE. If you want to use EurekaLog for some IDE - mark the checkbox, otherwise - clear it.&lt;br /&gt;
&lt;br /&gt;
Additionally, EurekaLog 7 has "Register EurekaLog into IDE" option:&lt;br /&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-htlOiXL4xe0/Tu-CkTaFs6I/AAAAAAAADB4/6sP-jRNk1Dk/s1600/EL7IDEs.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="326" src="http://4.bp.blogspot.com/-htlOiXL4xe0/Tu-CkTaFs6I/AAAAAAAADB4/6sP-jRNk1Dk/s400/EL7IDEs.png" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;IDE selection in EurekaLog 7 installer&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
If you set this checkbox - EurekaLog 7 will be registered into IDE (much like as EurekaLog 6 installer does). If you clear this checkbox - EurekaLog's files will be installed (copied), but EurekaLog will not be registered in IDE.&lt;br /&gt;
&lt;br /&gt;
If you install EurekaLog 7 when EurekaLog 6 is already installed, this option will not be visible (and it will be considered cleared). That's why you can safely install EurekaLog 7 - your EurekaLog 6 installation will not be affected.&lt;br /&gt;
&lt;br /&gt;
You can find both EurekaLog versions in Start Menu after installation:&lt;br /&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-9Ws8pZzF0uc/Tu-MDeJlgvI/AAAAAAAADCE/nwtV7Wo560A/s1600/ELStartMenuItems.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="386" src="http://4.bp.blogspot.com/-9Ws8pZzF0uc/Tu-MDeJlgvI/AAAAAAAADCE/nwtV7Wo560A/s400/ELStartMenuItems.png" width="358" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;EurekaLog 6 and 7 in Start Menu/Programs&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
As we've already mentioned - EurekaLog 6 is active and EurekaLog 7 was installed without registration.&lt;br /&gt;
&lt;br /&gt;
Now, you can alter EurekaLog configuration in your own desired way.&lt;br /&gt;
&lt;br /&gt;
There may be different patterns of using EurekaLog. For example, if you have Delphi 7 and Delphi XE2 installed - you may want to use EurekaLog 6 for Delphi 7 and EurekaLog 7 for Delphi XE2. Other pattern: you have only one IDE installed (like Delphi XE2) and you want to use EurekaLog 6 for some of your projects and EurekaLog 7 for other projects. First usage case can be archieved by single configuration. However, since you can't have the two EurekaLog versions in one IDE at the same time (unit's files will conflict) - you can't archive case two with single one-time configuration. You need to manually switch between EurekaLog versions. You need to do this each time, when you want to use different EurekaLog version.&lt;br /&gt;
&lt;br /&gt;
Anyways, both cases are archived though EurekaLog manager. You can launch it from &lt;code&gt;Start Menu/Programs/EurekaLog 7.0.0 Trial/Manage&lt;/code&gt; menu item:&lt;br /&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-a2O4gxZjr1A/Tu-NVRh1jRI/AAAAAAAADCQ/JXOpmv7z0BY/s1600/ELManager.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="400" src="http://4.bp.blogspot.com/-a2O4gxZjr1A/Tu-NVRh1jRI/AAAAAAAADCQ/JXOpmv7z0BY/s400/ELManager.png" width="253" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;EurekaLog IDE configuration manager&lt;br /&gt;(indicating that EurekaLog 6 is active for Delphi 7)&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
Top panel contains information about installed EurekaLog's versions. You should see information for EurekaLog 6 and 7 here. Bottom part contains list of installed IDEs. The list is collapsed by default. Click on any IDE to expand it and you'll see manage options (on the screenshot above: the "Delphi 7" IDE is expanded).&lt;br /&gt;
&lt;br /&gt;
Each IDE has few information labels, indicated current state of EurekaLog, and options to remove EurekaLog ("No EurekaLog" button) or install a specific EurekaLog version ("EurekaLog 6 with IDE expert" or "EurekaLog 7 with IDE expert" buttons). There are also additional options to install EurekaLog in search path without installing IDE expert. These options aren't used in most cases, they are only used in custom cases.&lt;br /&gt;
&lt;br /&gt;
In order to function, EurekaLog has to specify search path for it's units ("Paths" item). If you want to compile your projects from IDE, EurekaLog also needs to install EurekaLog compiler ("Compiler" item) and IDE expert ("Expert" item). Those items are installed into &lt;code&gt;\Bin&lt;/code&gt; folder of your IDE.&lt;br /&gt;
&lt;br /&gt;
Just expand your IDE group and click on the desired option - and you'll switch to that configuration.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Note:&lt;/b&gt; be sure to restart your IDE for changes to take effect.&lt;br /&gt;
&lt;br /&gt;
&lt;h1&gt;Detecting installed EurekaLog version&lt;/h1&gt;
When you have two EurekaLog's versions installed - it's very important not to mix the settings and files, otherwise results will be catastrophical. If you install and use EurekaLog IDE expert - then you can quickly determinate currently active EurekaLog version by looking into IDE menu:&lt;br /&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-HxTVJDX9V0k/Tu-Qo3VMIgI/AAAAAAAADCc/OsH2jXqFeZA/s1600/EL6IDEMenuItems.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="219" src="http://1.bp.blogspot.com/-HxTVJDX9V0k/Tu-Qo3VMIgI/AAAAAAAADCc/OsH2jXqFeZA/s400/EL6IDEMenuItems.png" width="357" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;EurekaLog 6 adds menu item into root IDE's menu&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-ZCsETUuRG7s/Tu-Q0mmBi5I/AAAAAAAADCo/6kvjj_HZMxc/s1600/EL7IDEMenuItems.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="381" src="http://1.bp.blogspot.com/-ZCsETUuRG7s/Tu-Q0mmBi5I/AAAAAAAADCo/6kvjj_HZMxc/s400/EL7IDEMenuItems.png" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;EurekaLog 7 adds menu item under "Tools" menu&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
Alternatively, you can use different "About" windows to get exact EurekaLog version:&lt;br /&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-758YdSlLKro/Tu-RdhP0zOI/AAAAAAAADC0/xswwd9DUTWE/s1600/ELAbout1.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="367" src="http://4.bp.blogspot.com/-758YdSlLKro/Tu-RdhP0zOI/AAAAAAAADC0/xswwd9DUTWE/s400/ELAbout1.png" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;EurekaLog in Help/About menu&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-lIQ8T_UR-XE/Tu-RmpBkMhI/AAAAAAAADDA/rH4FR5cap0g/s1600/ELAbout2.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="346" src="http://4.bp.blogspot.com/-lIQ8T_UR-XE/Tu-RmpBkMhI/AAAAAAAADDA/rH4FR5cap0g/s400/ELAbout2.png" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;EurekaLog in "About EurekaLog" menu&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
If you don't have IDE expert installed - then the best way is to use "Manage" item in Start Menu/Programs. It will show you the current status of EurekaLog.&lt;br /&gt;
&lt;br /&gt;
Alternatively, you can check IDE search path settings. Go to Tools/Options/Library and check "Library path". It should point to EurekaLog 6 path (if EurekaLog 6 is active), EurekaLog 7 path (if EurekaLog 7 is active) or doesn't contain any EurekaLog-related path at all (if EurekaLog is not registered in IDE at all). Default EurekaLog path is:
&lt;ul&gt;
&lt;li&gt;EurekaLog 6: &lt;code&gt;C:\Program Files (x86)\EurekaLab\EurekaLog 6\&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;EurekaLog 7: &lt;code&gt;C:\Program Files (x86)\EurekaLab\EurekaLog 7\&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;&lt;h1&gt;Manage EurekaLog configuration for non-administrator user accounts&lt;/h1&gt;
"Manage" Start Menu item also allows you to manage EurekaLog configuration for different operating system user accounts. By default, EurekaLog installs and registers itself (if enabled during installation) only for single user account: the one, which launched installation. This must be an administrator account (in order to have permission access rights to write into Program Files folder). But you're not limited to using EurekaLog under administrator account only.&lt;br /&gt;
&lt;br /&gt;
To use EurekaLog under any other account:
&lt;ol&gt;
&lt;li&gt;Log in as administrator.
&lt;li&gt;Run "Manage" menu item from the Start Menu.&lt;/li&gt;
&lt;li&gt;Make sure that EurekaLog is installed into your IDE. If not - click on "EurekaLog 7 with IDE expert".&lt;/li&gt;
&lt;li&gt;Log off from administrator account.&lt;/li&gt;
&lt;li&gt;Log in to your target user account. It may be limited account.&lt;/li&gt;
&lt;li&gt;Run "Manage" menu item from the Start Menu.&lt;/li&gt;
&lt;li&gt;Click on "EurekaLog 7 with IDE expert".&lt;/li&gt;
&lt;li&gt;Run your IDE.&lt;/li&gt;
&lt;/ol&gt;
Actions 1-4 are optional. They are only needed, if you didn't register EurekaLog 7 into IDE during installation process. Here steps 1-4 are done to copy EurekaLog files into Program Files folder (only administrator can do this) and steps 5-8 are done to register EurekaLog under separate user account.&lt;br /&gt;
&lt;br /&gt;
&lt;h1&gt;Uninstalling&lt;/h1&gt;
You can uninstall EurekaLog via Start Menu or "Uninstall a program" Control Panel applet. If you have two versions of EurekaLog installed and you want to remove one of them - you'll need to reinstall another version.&lt;br /&gt;
&lt;br /&gt;
If for some reason you want to installe old EurekaLog version (which is not available on the web-site anymore) - please, &lt;a title="EurekaLog support" href="http://support.eurekalog.com/index.php?/Tickets/Submit"&gt;contact our support&lt;/a&gt; on that matter (use "Techincal support for Delphi/C++ Builder" category). &lt;br /&gt;
&lt;br /&gt;
&lt;h1&gt;Troubleshooting&lt;/h1&gt;
If you encounter any issues with installation/uninstallation, please refer to our troubleshooting guides:
&lt;ul&gt;
&lt;li&gt;&lt;a title="(Re)Installation of EurekaLog" href="http://eurekalog.blogspot.com/2009/08/reinstallation-of-eurekalog_11.html"&gt;For EurekaLog 6&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="EurekaLog 7 installation issues" href="http://www.eurekalog.com/help/eurekalog/installation_problems.php"&gt;For EurekaLog 7&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
If you're unable to resolve your problem with these detailed instructions - please, &lt;a title="EurekaLog Support" href="http://support.eurekalog.com/index.php?/Tickets/Submit"&gt;contact our support&lt;/a&gt; (use "Techincal support for Delphi/C++ Builder" category).&lt;br /&gt;
&lt;br /&gt;
&lt;h1&gt;EurekaLog 7 Tools Pack&lt;/h1&gt;
&lt;a title="Delphi and C++ Builder downloads" href="http://www.eurekalog.com/downloads_delphi.php"&gt;EurekaLog 7 Tools Pack&lt;/a&gt; can be installed to a machine with EurekaLog 6 without any additional issues, because it doesn't requires registration. It also can be uninstalled without interferring with EurekaLog 6.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Note:&lt;/b&gt; you can't install both EurekaLog 7 and EurekaLog 7 Tools Pack on the same machine, because EurekaLog 7 already contains EurekaLog 7 Tools Pack. Just install EurekaLog 7 only, no need to install EurekaLog 7 Tools Pack.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6789056281440007248-9088205520759504423?l=eurekalog.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=gRlZgDgUSTA:6QHnxb9RNFQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=gRlZgDgUSTA:6QHnxb9RNFQ:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?i=gRlZgDgUSTA:6QHnxb9RNFQ:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=gRlZgDgUSTA:6QHnxb9RNFQ:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?i=gRlZgDgUSTA:6QHnxb9RNFQ:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=gRlZgDgUSTA:6QHnxb9RNFQ:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?i=gRlZgDgUSTA:6QHnxb9RNFQ:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=gRlZgDgUSTA:6QHnxb9RNFQ:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?i=gRlZgDgUSTA:6QHnxb9RNFQ:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=gRlZgDgUSTA:6QHnxb9RNFQ:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/EurekaLog/~4/gRlZgDgUSTA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://eurekalog.blogspot.com/feeds/9088205520759504423/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://eurekalog.blogspot.com/2011/12/using-eurekalog-6-and-eurekalog-7-on.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6789056281440007248/posts/default/9088205520759504423?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6789056281440007248/posts/default/9088205520759504423?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/EurekaLog/~3/gRlZgDgUSTA/using-eurekalog-6-and-eurekalog-7-on.html" title="Using EurekaLog 6 and EurekaLog 7 on the same machine and/or in the same IDE version" /><author><name>Александр Алексеев</name><uri>https://profiles.google.com/113168002104297556003</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-aUMttZQBsuI/AAAAAAAAAAI/AAAAAAAAC3Y/QuZ7K9t_WzE/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-uckCzfib-UM/Tu-BpwPYtmI/AAAAAAAADBs/Kjim1lAUoUg/s72-c/EL7Warning.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://eurekalog.blogspot.com/2011/12/using-eurekalog-6-and-eurekalog-7-on.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ak4MQng4eip7ImA9WhRXE08.&quot;"><id>tag:blogger.com,1999:blog-6789056281440007248.post-8722439715547384656</id><published>2011-12-19T17:57:00.001Z</published><updated>2011-12-19T21:09:43.632Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-19T21:09:43.632Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Delphi" /><category scheme="http://www.blogger.com/atom/ns#" term="EL 6.x" /><title>EurekaLog and XE2 update 3</title><content type="html">Update 3 for RAD Studio XE2 (Delphi and C++ Builder) has broken working of EurekaLog.&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
The new EurekaLog 6.1.04 RC 2 should be able to address this issue. You may download it from our web-site: &lt;a href="http://www.eurekalog.com/login.php" title="Login"&gt;area for the registered customers&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Note:&lt;/b&gt; EurekaLog 6.1.04 RC 2 is &lt;b&gt;not&lt;/b&gt; compatible with Delphi XE2/C++ Builder XE2 update 1 or update 2. You must have update 3 installed. If you don't have update 3 installed - you'll have a warning during installation.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6789056281440007248-8722439715547384656?l=eurekalog.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=Zi_E2LRrvQ8:fky_iWm_6Ao:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=Zi_E2LRrvQ8:fky_iWm_6Ao:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?i=Zi_E2LRrvQ8:fky_iWm_6Ao:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=Zi_E2LRrvQ8:fky_iWm_6Ao:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?i=Zi_E2LRrvQ8:fky_iWm_6Ao:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=Zi_E2LRrvQ8:fky_iWm_6Ao:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?i=Zi_E2LRrvQ8:fky_iWm_6Ao:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=Zi_E2LRrvQ8:fky_iWm_6Ao:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?i=Zi_E2LRrvQ8:fky_iWm_6Ao:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=Zi_E2LRrvQ8:fky_iWm_6Ao:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/EurekaLog/~4/Zi_E2LRrvQ8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://eurekalog.blogspot.com/feeds/8722439715547384656/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://eurekalog.blogspot.com/2011/12/eurekalog-and-xe2-update-3.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6789056281440007248/posts/default/8722439715547384656?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6789056281440007248/posts/default/8722439715547384656?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/EurekaLog/~3/Zi_E2LRrvQ8/eurekalog-and-xe2-update-3.html" title="EurekaLog and XE2 update 3" /><author><name>Александр Алексеев</name><uri>https://profiles.google.com/113168002104297556003</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-aUMttZQBsuI/AAAAAAAAAAI/AAAAAAAAC3Y/QuZ7K9t_WzE/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://eurekalog.blogspot.com/2011/12/eurekalog-and-xe2-update-3.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkANRHw8cSp7ImA9WhdUEk4.&quot;"><id>tag:blogger.com,1999:blog-6789056281440007248.post-4530951452058725796</id><published>2011-09-28T19:33:00.000+01:00</published><updated>2011-09-28T19:33:15.279+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-28T19:33:15.279+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Delphi" /><category scheme="http://www.blogger.com/atom/ns#" term="EL 6.x" /><category scheme="http://www.blogger.com/atom/ns#" term="Releases" /><title>EurekaLog 6.1.03 is out - now with XE2 and FireMonkey support</title><content type="html">We are pleased to announce the availability of the new 6.1.03 version.&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;
&lt;div style="text-align: center;"&gt;
&lt;a href="http://www.eurekalog.com/" target="_blank" title="EurekaLog Logo"&gt;&lt;img alt="EurekaLog Logo" height="68" src="http://www.eurekalog.com/images/logo.png" width="295" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;blockquote&gt;EurekaLog is a tool for Delphi and C++Builder that gives your application the power to catch every exception and memory leak, generating a detailed log of the call stack (with unit, procedure and line number), optionally sending you a copy of each log entry via email or the Web via the most used Web Bug-Tracking tools (as Mantis, BugZilla and FogBugz).&lt;/blockquote&gt;
EurekaLog represents the most advanced exception and memory leaks logger technology available for Delphi/C++Builder developers.&lt;br /&gt;
&lt;br /&gt;
To learn more about EurekaLog, please visit our website at: &lt;br /&gt;
&lt;a href="http://www.eurekalog.com/" target="_blank" title="http://www.eurekalog.com"&gt;http://www.eurekalog.com&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
To download a demo, please visit:&lt;br /&gt;
&lt;a href="http://www.eurekalog.com/downloads.php" target="_blank" title="http://www.eurekalog.com/downloads.php"&gt;http://www.eurekalog.com/downloads.php&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
If you would like to purchase a new license, please visit:&lt;br /&gt;
&lt;a href="http://www.eurekalog.com/buy.php" target="_blank" title="http://www.eurekalog.com/buy.php"&gt;http://www.eurekalog.com/buy.php&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Upgrade policy:&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
If you would like to purchase an upgrade, this is our upgrade discount policy:&lt;br /&gt;
&lt;br /&gt;
1)...upgrade from any 4.x or 5.x to any 6.x - 50% discount;&lt;br /&gt;
2)...upgrade from a 6.x license type to another (ex: from a "Single Professional" to a "Corporate Professional") - the price difference.&lt;br /&gt;
&lt;br /&gt;
NOTE: the upgrade from an old 6.x version to the last released version is full free.&lt;br /&gt;
&lt;br /&gt;
Buy your upgrade or download your full version here:&lt;br /&gt;
&lt;a href="http://www.eurekalog.com/login.php" target="_blank" title="http://www.eurekalog.com/login.php"&gt;http://www.eurekalog.com/login.php&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Changes:&lt;/strong&gt;
&lt;ol&gt;
&lt;li&gt;Added: support for RAD Studio XE2 (Win32 platform only)&lt;/li&gt;
&lt;li&gt;Added: support for FireMonkey framework (Win32 platform only)&lt;/li&gt;
&lt;li&gt;Improved: new leaks for "Hide Borland leaks" option&lt;/li&gt;
&lt;li&gt;Fixed: Escape key could cancel process termination&lt;/li&gt;
&lt;li&gt;Fixed: variables didn't worked for exception filters&lt;/li&gt;
&lt;li&gt;Fixed: rare application hang up at shutdown&lt;/li&gt;
&lt;li&gt;Fixed: encoding issues for run-time option switching&lt;/li&gt;
&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6789056281440007248-4530951452058725796?l=eurekalog.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=9e7tW4CI3Lg:F7VserxLPoI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=9e7tW4CI3Lg:F7VserxLPoI:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?i=9e7tW4CI3Lg:F7VserxLPoI:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=9e7tW4CI3Lg:F7VserxLPoI:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?i=9e7tW4CI3Lg:F7VserxLPoI:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=9e7tW4CI3Lg:F7VserxLPoI:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?i=9e7tW4CI3Lg:F7VserxLPoI:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=9e7tW4CI3Lg:F7VserxLPoI:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?i=9e7tW4CI3Lg:F7VserxLPoI:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=9e7tW4CI3Lg:F7VserxLPoI:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/EurekaLog/~4/9e7tW4CI3Lg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://eurekalog.blogspot.com/feeds/4530951452058725796/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://eurekalog.blogspot.com/2011/09/eurekalog-6103-is-out-now-with-xe2-and.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6789056281440007248/posts/default/4530951452058725796?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6789056281440007248/posts/default/4530951452058725796?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/EurekaLog/~3/9e7tW4CI3Lg/eurekalog-6103-is-out-now-with-xe2-and.html" title="EurekaLog 6.1.03 is out - now with XE2 and FireMonkey support" /><author><name>Александр Алексеев</name><uri>https://profiles.google.com/113168002104297556003</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-aUMttZQBsuI/AAAAAAAAAAI/AAAAAAAAC3Y/QuZ7K9t_WzE/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://eurekalog.blogspot.com/2011/09/eurekalog-6103-is-out-now-with-xe2-and.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkQHR3Yzfip7ImA9WhVQF00.&quot;"><id>tag:blogger.com,1999:blog-6789056281440007248.post-1904005966662165507</id><published>2011-09-15T11:04:00.000+01:00</published><updated>2012-04-06T11:32:16.886+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-04-06T11:32:16.886+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Visual Studio" /><category scheme="http://www.blogger.com/atom/ns#" term="Releases" /><title>EurekaLog 6.5.12 for .NET is out</title><content type="html">We are pleased to announce the availability of the new 6.5.12 version.&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;div style="text-align: center;"&gt;
&lt;a href="http://www.eurekalog.com/" target="_blank" title="EurekaLog Logo"&gt;&lt;img alt="EurekaLog Logo" height="68" src="http://www.eurekalog.com/images/logo.png" width="295" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;blockquote&gt;
EurekaLog is a tool for Delphi and C++Builder that gives your application the power to catch every exception and memory leak, generating a detailed log of the call stack (with unit, procedure and line number), optionally sending you a copy of each log entry via email or the Web via the most used Web Bug-Tracking tools (as Mantis, BugZilla and FogBugz).&lt;/blockquote&gt;
EurekaLog represents the most advanced exception and memory leaks logger technology available for Delphi/C++Builder developers.&lt;br /&gt;
&lt;br /&gt;
To learn more about EurekaLog, please visit our website at: &lt;br /&gt;
&lt;a href="http://www.eurekalog.com/" target="_blank" title="http://www.eurekalog.com"&gt;http://www.eurekalog.com&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
To download a demo, please visit:&lt;br /&gt;
&lt;a href="http://www.eurekalog.com/downloads.php" target="_blank" title="http://www.eurekalog.com/downloads.php"&gt;http://www.eurekalog.com/downloads.php&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
If you would like to purchase a new license, please visit:&lt;br /&gt;
&lt;a href="http://www.eurekalog.com/buy.php" target="_blank" title="http://www.eurekalog.com/buy.php"&gt;http://www.eurekalog.com/buy.php&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Changes:&lt;/b&gt;
&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;Improved: uninstall procedure to clean up any leftover files that are no longer needed&lt;/li&gt;
&lt;li&gt;Improved: e-mail validation&lt;/li&gt;
&lt;li&gt;Improved: Mantis compatibility&lt;/li&gt;
&lt;li&gt;Improved: thread safety&lt;/li&gt;
&lt;li&gt;Fixed: bug that in some cases causes Visual Studio to hang on load&lt;/li&gt;
&lt;li&gt;Fixed: bug that mistakenly reported Windows 7 as Windows Vista&lt;/li&gt;
&lt;li&gt;Fixed: problem with detail dialog, not showing threaded and inner exceptions' details in all cases&lt;/li&gt;
&lt;li&gt;Fixed: problem causing VS to open a lot of files unnecessarily while building the solution&lt;/li&gt;
&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6789056281440007248-1904005966662165507?l=eurekalog.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=zf4yt9oT-iw:RAe3xK7nblU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=zf4yt9oT-iw:RAe3xK7nblU:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?i=zf4yt9oT-iw:RAe3xK7nblU:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=zf4yt9oT-iw:RAe3xK7nblU:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?i=zf4yt9oT-iw:RAe3xK7nblU:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=zf4yt9oT-iw:RAe3xK7nblU:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?i=zf4yt9oT-iw:RAe3xK7nblU:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=zf4yt9oT-iw:RAe3xK7nblU:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?i=zf4yt9oT-iw:RAe3xK7nblU:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=zf4yt9oT-iw:RAe3xK7nblU:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/EurekaLog/~4/zf4yt9oT-iw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://eurekalog.blogspot.com/feeds/1904005966662165507/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://eurekalog.blogspot.com/2011/09/eurekalog-6512-for-net-is-out.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6789056281440007248/posts/default/1904005966662165507?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6789056281440007248/posts/default/1904005966662165507?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/EurekaLog/~3/zf4yt9oT-iw/eurekalog-6512-for-net-is-out.html" title="EurekaLog 6.5.12 for .NET is out" /><author><name>Александр Алексеев</name><uri>https://profiles.google.com/113168002104297556003</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-aUMttZQBsuI/AAAAAAAAAAI/AAAAAAAAC3Y/QuZ7K9t_WzE/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://eurekalog.blogspot.com/2011/09/eurekalog-6512-for-net-is-out.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0YMQ3Y5fCp7ImA9WhdSE0g.&quot;"><id>tag:blogger.com,1999:blog-6789056281440007248.post-5095768152646261528</id><published>2011-07-22T18:19:00.000+01:00</published><updated>2011-07-22T18:19:42.824+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-07-22T18:19:42.824+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Delphi" /><category scheme="http://www.blogger.com/atom/ns#" term="EL 6.x" /><category scheme="http://www.blogger.com/atom/ns#" term="Releases" /><title>EurekaLog 6.1.02 is out</title><content type="html">We are pleased to announce the availability of the new 6.1.02 version.&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;div style="text-align: center;"&gt;
&lt;a href="http://www.eurekalog.com/" target="_blank" title="EurekaLog Logo"&gt;&lt;img alt="EurekaLog Logo" height="68" src="http://www.eurekalog.com/images/logo.png" width="295" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;blockquote&gt;
EurekaLog is a tool for Delphi and C++Builder that gives your application the power to catch every exception and memory leak, generating a detailed log of the call stack (with unit, procedure and line number), optionally sending you a copy of each log entry via email or the Web via the most used Web Bug-Tracking tools (as Mantis, BugZilla and FogBugz).&lt;/blockquote&gt;
EurekaLog represents the most advanced exception and memory leaks logger technology available for Delphi/C++Builder developers.&lt;br /&gt;
&lt;br /&gt;
To learn more about EurekaLog, please visit our website at:&lt;br /&gt;
&lt;a href="http://www.eurekalog.com/" target="_blank" title="http://www.eurekalog.com"&gt;http://www.eurekalog.com&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
To download a demo, please visit:&lt;br /&gt;
&lt;a href="http://www.eurekalog.com/downloads.php" target="_blank" title="http://www.eurekalog.com/downloads.php"&gt;http://www.eurekalog.com/downloads.php&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
If you would like to purchase a new license, please visit:&lt;br /&gt;
&lt;a href="http://www.eurekalog.com/buy.php" target="_blank" title="http://www.eurekalog.com/buy.php"&gt;http://www.eurekalog.com/buy.php&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;&lt;br /&gt;Upgrade policy:&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
If you would like to purchase an upgrade, this is our upgrade discount policy:&lt;br /&gt;
&lt;br /&gt;
1)...upgrade from any 4.x or 5.x to any 6.x - 50% discount;&lt;br /&gt;
2)...upgrade from a 6.x license type to another (ex: from a "Single Professional" to a "Corporate Professional") - the price difference.&lt;br /&gt;
&lt;br /&gt;
NOTE: the upgrade from an old 6.x version to the last released version is full free.&lt;br /&gt;
&lt;br /&gt;
Buy your upgrade or download your full version here:&lt;br /&gt;
&lt;a href="http://www.eurekalog.com/login.php" target="_blank" title="http://www.eurekalog.com/login.php"&gt;http://www.eurekalog.com/login.php&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;&lt;br /&gt;Changes:&lt;/strong&gt;&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;Added: BugZilla 4.x support&lt;/li&gt;
&lt;li&gt;Added: (Mantis) category is now optional&lt;/li&gt;
&lt;li&gt;Fixed: address space leak due to multi-thread concurensy&lt;/li&gt;
&lt;li&gt;Fixed: Sometimes EurekaLog unable to get thread's call stack&lt;/li&gt;
&lt;li&gt;Fixed: EurekaLog fails to show information about last routine in unit&lt;/li&gt;
&lt;li&gt;Fixed: memory leaks detection has trimmed call stack (some specific Delphi versions)&lt;/li&gt;
&lt;li&gt;Fixed: Viewer configuration issue on limited user&lt;/li&gt;
&lt;li&gt;Fixed: emake sometime doesn't work&lt;/li&gt;
&lt;li&gt;Fixed: crash, if module info wasn't available&lt;/li&gt;
&lt;li&gt;Fixed: wrong detection of handled exceptions for certain environments&lt;/li&gt;
&lt;li&gt;Fixed: problems with thread locking for specific components&lt;/li&gt;
&lt;li&gt;Fixed: error in fallback code in DllFullPath&lt;/li&gt;
&lt;li&gt;Fixed: Installer creates unnecessary files&lt;/li&gt;
&lt;li&gt;Fixed: nag screen is not DPI awared&lt;/li&gt;
&lt;li&gt;Fixed: wrong handling of WM_QUIT - dialog enters endless cycle&lt;/li&gt;
&lt;li&gt;Fixed: .eof file can be not recognized as valid .eof file on some rare conditions&lt;/li&gt;
&lt;li&gt;Fixed: changed date-time is not updated when overwriting .eof file&lt;/li&gt;
&lt;li&gt;Fixed: increased stability for getting memory dumps &lt;/li&gt;
&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6789056281440007248-5095768152646261528?l=eurekalog.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=u4JoJZPrtLg:axgZOuBxTWg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=u4JoJZPrtLg:axgZOuBxTWg:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?i=u4JoJZPrtLg:axgZOuBxTWg:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=u4JoJZPrtLg:axgZOuBxTWg:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?i=u4JoJZPrtLg:axgZOuBxTWg:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=u4JoJZPrtLg:axgZOuBxTWg:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?i=u4JoJZPrtLg:axgZOuBxTWg:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=u4JoJZPrtLg:axgZOuBxTWg:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?i=u4JoJZPrtLg:axgZOuBxTWg:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=u4JoJZPrtLg:axgZOuBxTWg:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/EurekaLog/~4/u4JoJZPrtLg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://eurekalog.blogspot.com/feeds/5095768152646261528/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://eurekalog.blogspot.com/2011/07/eurekalog-6102-is-out.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6789056281440007248/posts/default/5095768152646261528?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6789056281440007248/posts/default/5095768152646261528?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/EurekaLog/~3/u4JoJZPrtLg/eurekalog-6102-is-out.html" title="EurekaLog 6.1.02 is out" /><author><name>Александр Алексеев</name><uri>https://profiles.google.com/113168002104297556003</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-aUMttZQBsuI/AAAAAAAAAAI/AAAAAAAAC3Y/QuZ7K9t_WzE/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://eurekalog.blogspot.com/2011/07/eurekalog-6102-is-out.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0MCQn46fCp7ImA9Wx9QF04.&quot;"><id>tag:blogger.com,1999:blog-6789056281440007248.post-5128901575734380978</id><published>2010-12-30T17:07:00.003Z</published><updated>2010-12-30T17:51:03.014Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-12-30T17:51:03.014Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="EL 6.x" /><category scheme="http://www.blogger.com/atom/ns#" term="Releases" /><title>Introducing EurekaLog 6.1</title><content type="html">We made a present for our customers at New Year 2010-2011 by releasing EurekaLog 6.1. So... what's new?&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;b&gt;Q: What is new in EurekaLog 6.1?&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;A: &lt;/b&gt;EurekaLog 6.1 is exactly the same as EurekaLog 6.0 (6.0.25 is the latest available version), except one "little" detail: we've added support for new compiler from EurekaLog 7.0 (which is in development right now).&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Q: Why is it 6.1? Why not 6.0.26?&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;A: &lt;/b&gt;We do only bug fixes in 6.x branch, so we get 6.0.10, 6.0.20, 6.0.25, etc. Each new version (like 6.0.xx) contains bug fixes, but no new features. Since we've added a major new feature - we decided to increase a version number, so new version became 6.1 - indicating addition of a major new feature.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Q: Is it safe to upgrade? Am I affected?&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;A: &lt;/b&gt;Don't worry, 6.1.xx behaves as 6.0.xx by default. You can safely upgrade and no new changes will affect you (except the usual bug fixes). New compiler have no effect, until explicty enabled.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Q: What's so great about new compiler?&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;A: &lt;/b&gt;In recent 3 months there were many reports about problems with EurekaLog and debug information (i.e. mapping between code and human-readable names of units, methods, etc). After investigation we've discovered that there appears linker bugs (usually on large projects), which prevents EurekaLog from proper functioning. Also, there are some internal limitations of EurekaLog for large projects&lt;sup&gt;1&lt;/sup&gt;.&lt;br /&gt;
&lt;br /&gt;
What does it mean? It means that for some large projects EurekaLog can't show you a proper call stack because of wrong debug information, which is usually caused by linker's bugs.&lt;br /&gt;
&lt;br /&gt;
Well, I'm a bit surprised that no one is ever reported such issues before (at least not while I was working for EurekaLab s.a.s.). So these last months were really a hit on this.&lt;br /&gt;
&lt;br /&gt;
OK, so the new compiler from EurekaLog 7 have a new architecture and a new code (it's re-written almost on 80%) and it is able to solve these problems (along with help of new format of debug information).&lt;br /&gt;
&lt;br /&gt;
Another advantages are:
&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;Increased speed. New compiler should be (theoretically) faster than old, since we've reduced amount of work with strings.&lt;/li&gt;
&lt;li&gt;Reduced memory consumption. New compiler should be (theoretically) more conservative about memory usage, since we're working on since mapped file, instead of parsing it into separate strings.&lt;/li&gt;
&lt;li&gt;Increased stability. Any issues with compiler itself does not affect IDE, since compiler is now run into separate process.&lt;/li&gt;
&lt;li&gt;Increased detalization. New compiler is able to store routines without line numbers. Old compiler can't do this. Usually this doesn't matter anyway, since &lt;a href="http://eurekalog.blogspot.com/2009/04/optimal-project-settings_21.html" title="Optimal project settings"&gt;we always recommend to enable "Use Debug DCUs" option&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;
Items 2 and 3 allows you to use EurekaLog for very large projects, which wasn't possible before (because of shared virtual address space with IDE and, thus, hitting a memory limits).&lt;br /&gt;
&lt;br /&gt;
Word "theoretically" means that we think so, but we don't have any exact estimates yet. So, if you're owning a large project (say, 10+ MB .exe file or 15+ MB .map file) - please, send us (even very approximate) details about how fast (or slow!) compilation is with old and new compiler.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Q: Why add compiler from EurekaLog 7 to EurekaLog 6? Why not just fix issues in EurekaLog 6? Or just wait for EurekaLog 7 release?&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;A: &lt;/b&gt;Because it's impossible to fix these issues with old logic of compiler (there are much technical details here, I won't going to discuss them). To solve these issues in EurekaLog 6, one needs to almost re-write the compiler - pretty much the same job as was already completed in EurekaLog 7 (compiler upgrade in EurekaLog 7 wasn't because of these issues - we just improved code. Solving these issues was a side-effect).&lt;br /&gt;
&lt;br /&gt;
So why just not port code from EurekaLog 7 to EurekaLog 6? Well, we tried this, but it's not easy too, since there are a lot of changes (also remember that we dropped support for Delphi 3, so we used new features a lot).&lt;br /&gt;
&lt;br /&gt;
Why not just leave this as is, claiming that customers should wait for EurekaLog 7? I'm not saying that EurekaLog 7 have a long road before release, but I'm saying that we care about our customers, so we've decided to release intermediate EurekaLog 6.1, which solves some major problems of our customers.&lt;br /&gt;
&lt;br /&gt;
Thus, the only solution left is to include new compiler as an option to EurekaLog 6.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Q: When I should use new compiler?&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;A: &lt;/b&gt;If you have small/medium project and never suffer from weird call stacks - then you can just ignore it. Don't use new compiler (which is default, BTW). Otherwise - try it. New compiler may help you to solve your issues.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Q: How to use it?&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;A: &lt;/b&gt;Very simple. Just go to &lt;code&gt;Project&lt;/code&gt; / &lt;code&gt;EurekaLog options&lt;/code&gt;, select &lt;code&gt;Build options&lt;/code&gt; tab and enable &lt;code&gt;Use EurekaLog 7 compiler&lt;/code&gt; checkbox:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/_9sWBW4MIeFk/TRyzK3by8UI/AAAAAAAACbM/IXq9xjAsGrU/s1600/Enabling%2Boption.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="279" src="http://4.bp.blogspot.com/_9sWBW4MIeFk/TRyzK3by8UI/AAAAAAAACbM/IXq9xjAsGrU/s400/Enabling%2Boption.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;b&gt;Q: What about command line compilation and build automation?&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;A: &lt;/b&gt;That is possible too. You can find new compiler in your EurekaLog folder under sub-folder which corresponds to your IDE. For example:
&lt;br /&gt;
&lt;pre&gt;C:\Program Files\EurekaLab\EurekaLog 6\Delphi15\el7c.exe&lt;/pre&gt;
The same .exe file can be used for both Delphi and C++ Builder - just be sure that you pick a correct version (in case if you have several different versions of IDE installed).&lt;br /&gt;
&lt;br /&gt;
You can use this file exactly as &lt;a href="http://eurekalog.blogspot.com/2009/04/compiling-from-command-line_07.html" title="Compiling from the command Line"&gt;the old ecc32.exe/emake.exe&lt;/a&gt;. Except there are few additional options:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/_9sWBW4MIeFk/TRy0YjADTTI/AAAAAAAACbU/SXLkbSoLMI8/s1600/ecc32%2Bhelp.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://4.bp.blogspot.com/_9sWBW4MIeFk/TRy0YjADTTI/AAAAAAAACbU/SXLkbSoLMI8/s400/ecc32%2Bhelp.PNG" width="329" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;--el_output=el6&lt;/code&gt; - instructs compiler to produce debug information in EurekaLog 6 format. &lt;b&gt;Mandatory&lt;/b&gt;. You must add this switch.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--el_mode=delphi&lt;/code&gt; or &lt;code&gt;--el_mode=builder&lt;/code&gt; - switches between Delphi and C++ Builder project. &lt;b&gt;Mandatory&lt;/b&gt;. You must add this switch.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--el_path=&lt;i&gt;folderpath&lt;/i&gt;&lt;/code&gt; - &lt;i&gt;folderpath&lt;/i&gt; is full absolute path to EurekaLog folder. This is optional switch, but &lt;b&gt;we strongly recommend to specify it&lt;/b&gt;. For example:
&lt;pre&gt;"--el_path=C:\Program Files\EurekaLab\EurekaLog 6"&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--el_gui_error&lt;/code&gt; - show errors in message boxes instead of writing them to the console. Optional. Usually you want to add this, if you run compiler from IDE or other GUI tool. You probably don't want to specify it, if you run compiler from console or automated build script.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--el_target=&lt;i&gt;filename&lt;/i&gt;&lt;/code&gt; - specifies output file name. Optional. By default EurekaLog tries to get this from project's options (which is not always possible). It's not needed for &lt;code&gt;--el_alter_exe&lt;/code&gt; switch, since output file name can be specified inside &lt;code&gt;--el_alter_exe&lt;/code&gt; switch itself.&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;b&gt;Q: I don't want to use experimental compiler from a EurekaLog 7, which doesn't even have a stable release!&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;A: &lt;/b&gt;First I want to highlight that EurekaLog's code remain the same. New compiler doesn't affect the code. It's still old good and tested 6.0.25. New compiler affects only additional debug  information. So, if you have problems with debug information, new compiler may solve it. I.e. it's not worse than it's already is. Surely, you may not use new compiler, if you don't need to.&lt;br /&gt;
&lt;br /&gt;
Yes, new compiler comes from unstable version of EurekaLog 7. However, we've tested a new compiler quite strict. Sure we may miss something, but it's quite stable now.&lt;br /&gt;
&lt;br /&gt;
Of course, you shouldn't just enable this option and throw your application to your customers. You need to do a few simple tests:
&lt;ul&gt;
&lt;li&gt;Try just to compile your application with new compiler - will it be successfull? New compiler contains additional asserts, which trigger on unsupported cases.&lt;/li&gt;
&lt;li&gt;Take a known issue with bug report and check this issue against new compiler - will a new bug report be better than old?&lt;/li&gt;
&lt;li&gt;You can place a button, which raises exception somewhere deep inside your code. Will a bug report be detailed enough?&lt;/li&gt;
&lt;/ul&gt;
If these tests will pass - then you can safely use new compiler. If not - please, &lt;a href="http://www.eurekalog.com/support.php" title="Contact EurekaLog support"&gt;contact us&lt;/a&gt;, so we can improve our product!&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Thank you for all your valuable feedback and I wish you a happy New Year!&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Remarks:&lt;br /&gt;
&lt;sup&gt;1&lt;/sup&gt; - for example, EurekaLog uses signed word (2 bytes) as offset between code from neighbour lines. Usually this is not a problem, since machine code goes in the same order as source (indeed, many people even rely on this undocumented behavior), so you rarely see values larger than 128 - not even saying about 32768!&lt;br /&gt;
&lt;br /&gt;
However, we've found that in some (rare) cases code may go in really wild order. So if you wave a unit larger than 32768 lines AND such thing happens (I don't know if this is another linker bug or planned behavior) - EurekaLog won't be able to handle this. New debug format of EurekaLog 7 uses up to 4 bytes for offsets, so these cases are covered. However, old debug format is still limited to 2 bytes offsets.&lt;br /&gt;
&lt;br /&gt;
There may be 1 or 2 other but similar issues - I don't really remember them now.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6789056281440007248-5128901575734380978?l=eurekalog.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=2x41dDi6Jlg:7QTBoWSGZXA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=2x41dDi6Jlg:7QTBoWSGZXA:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?i=2x41dDi6Jlg:7QTBoWSGZXA:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=2x41dDi6Jlg:7QTBoWSGZXA:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?i=2x41dDi6Jlg:7QTBoWSGZXA:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=2x41dDi6Jlg:7QTBoWSGZXA:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?i=2x41dDi6Jlg:7QTBoWSGZXA:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=2x41dDi6Jlg:7QTBoWSGZXA:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?i=2x41dDi6Jlg:7QTBoWSGZXA:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=2x41dDi6Jlg:7QTBoWSGZXA:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/EurekaLog/~4/2x41dDi6Jlg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://eurekalog.blogspot.com/feeds/5128901575734380978/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://eurekalog.blogspot.com/2010/12/introducing-eurekalog-61.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6789056281440007248/posts/default/5128901575734380978?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6789056281440007248/posts/default/5128901575734380978?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/EurekaLog/~3/2x41dDi6Jlg/introducing-eurekalog-61.html" title="Introducing EurekaLog 6.1" /><author><name>Александр Алексеев</name><uri>https://profiles.google.com/113168002104297556003</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-aUMttZQBsuI/AAAAAAAAAAI/AAAAAAAAC3Y/QuZ7K9t_WzE/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_9sWBW4MIeFk/TRyzK3by8UI/AAAAAAAACbM/IXq9xjAsGrU/s72-c/Enabling%2Boption.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://eurekalog.blogspot.com/2010/12/introducing-eurekalog-61.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkIGSHcyeip7ImA9Wx9SEkk.&quot;"><id>tag:blogger.com,1999:blog-6789056281440007248.post-3989731835076063407</id><published>2010-12-01T21:55:00.000Z</published><updated>2010-12-01T21:55:29.992Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-12-01T21:55:29.992Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Delphi" /><category scheme="http://www.blogger.com/atom/ns#" term="best practice" /><title>ITDevCon sessions from EurekaLab s.a.s.</title><content type="html">&lt;a href="http://www.itdevcon.it/home/en" title="ITDevCon - home"&gt;There was a ITDevCon conference recently - 17-19th November 2010&lt;/a&gt;. I (Alex) took two sessions on this event: "Advanced features of Delphi's debugger" and "How to debug application's crash".&lt;br /&gt;
&lt;br /&gt;
I had prepared two presentations for these sessions in OpenOffice Impress and some accompanied text in OpenOffice Writer for this event. And I thought that you may be interested in those materials, so I decided to publish them.&lt;br /&gt;
&lt;br /&gt;
You can download both sessions in one archive &lt;a href="http://www.eurekalog.com/files/ITDevCon2010.zip" title="Download ITDevCon2010.zip (873 Kb)"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6789056281440007248-3989731835076063407?l=eurekalog.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=RRogmtbDcr4:J-ElsOJDoQA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=RRogmtbDcr4:J-ElsOJDoQA:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?i=RRogmtbDcr4:J-ElsOJDoQA:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=RRogmtbDcr4:J-ElsOJDoQA:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?i=RRogmtbDcr4:J-ElsOJDoQA:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=RRogmtbDcr4:J-ElsOJDoQA:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?i=RRogmtbDcr4:J-ElsOJDoQA:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=RRogmtbDcr4:J-ElsOJDoQA:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?i=RRogmtbDcr4:J-ElsOJDoQA:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=RRogmtbDcr4:J-ElsOJDoQA:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/EurekaLog/~4/RRogmtbDcr4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://eurekalog.blogspot.com/feeds/3989731835076063407/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://eurekalog.blogspot.com/2010/12/itdevcon-sessions-from-eurekalab-sas.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6789056281440007248/posts/default/3989731835076063407?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6789056281440007248/posts/default/3989731835076063407?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/EurekaLog/~3/RRogmtbDcr4/itdevcon-sessions-from-eurekalab-sas.html" title="ITDevCon sessions from EurekaLab s.a.s." /><author><name>Александр Алексеев</name><uri>https://profiles.google.com/113168002104297556003</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-aUMttZQBsuI/AAAAAAAAAAI/AAAAAAAAC3Y/QuZ7K9t_WzE/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://eurekalog.blogspot.com/2010/12/itdevcon-sessions-from-eurekalab-sas.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkYESXc4fSp7ImA9Wx9SEkk.&quot;"><id>tag:blogger.com,1999:blog-6789056281440007248.post-1045904516347758176</id><published>2010-11-22T14:02:00.017Z</published><updated>2010-12-01T22:55:08.935Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-12-01T22:55:08.935Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Delphi" /><category scheme="http://www.blogger.com/atom/ns#" term="EL 6.x" /><category scheme="http://www.blogger.com/atom/ns#" term="Releases" /><title>EurekaLog 6.0.25 is out</title><content type="html">We are pleased to announce the availability of the new 6.0.25 version.&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;div style="text-align: center;"&gt;
&lt;a href="http://www.eurekalog.com/" target="_blank" title="EurekaLog Logo"&gt;&lt;img alt="EurekaLog Logo" height="68" src="http://www.eurekalog.com/images/logo.png" width="295" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;blockquote&gt;
EurekaLog is a tool for Delphi and C++Builder that gives your application the power to catch every exception and memory leak, generating a detailed log of the call stack (with unit, procedure and line number), optionally sending you a copy of each log entry via email or the Web via the most used Web Bug-Tracking tools (as Mantis, BugZilla and FogBugz).&lt;/blockquote&gt;
EurekaLog represents the most advanced exception and memory leaks logger technology available for Delphi/C++Builder developers.&lt;br /&gt;
&lt;br /&gt;
To learn more about EurekaLog, please visit our website at:&lt;br /&gt;
&lt;a href="http://www.eurekalog.com/" target="_blank" title="http://www.eurekalog.com"&gt;http://www.eurekalog.com&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
To download a demo, please visit:&lt;br /&gt;
&lt;a href="http://www.eurekalog.com/downloads.php" target="_blank" title="http://www.eurekalog.com/downloads.php"&gt;http://www.eurekalog.com/downloads.php&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
If you would like to purchase a new license, please visit:&lt;br /&gt;
&lt;a href="http://www.eurekalog.com/buy.php" target="_blank" title="http://www.eurekalog.com/buy.php"&gt;http://www.eurekalog.com/buy.php&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;&lt;br /&gt;Upgrade policy:&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
If you would like to purchase an upgrade, this is our upgrade discount policy:&lt;br /&gt;
&lt;br /&gt;
1)...upgrade from any 4.x or 5.x to any 6.x - 50% discount;&lt;br /&gt;
2)...upgrade from a 6.x license type to another (ex: from a "Single Professional" to a "Corporate Professional") - the price difference.&lt;br /&gt;
&lt;br /&gt;
NOTE: the upgrade from an old 6.x version to the last released version is full free.&lt;br /&gt;
&lt;br /&gt;
Buy your upgrade or download your full version here:&lt;br /&gt;
&lt;a href="http://www.eurekalog.com/login.php" target="_blank" title="http://www.eurekalog.com/login.php"&gt;http://www.eurekalog.com/login.php&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;&lt;br /&gt;Changes:&lt;/strong&gt;&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;Added: support for Delphi XE and C++Builder XE;&lt;/li&gt;
&lt;li&gt;Added: SafeMM memory manager support;&lt;/li&gt;
&lt;li&gt;Fixed: a little Call-stack tracing improvment;&lt;/li&gt;
&lt;li&gt;Fixed: EurekaLog catched exceptions also when disabled;&lt;/li&gt;
&lt;li&gt;Fixed: installer's bug that didn't activate EurekaLog by default if this option was enabled;&lt;/li&gt;
&lt;li&gt;Fixed: wrong decode of some assembles views in the EurekaLog Viewer window;&lt;/li&gt;
&lt;li&gt;Changed: EurekaLog IDE integration is now set to OFF by default (to activate it use the "EurekaLog/IDE Integration" menu);&lt;/li&gt;
&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6789056281440007248-1045904516347758176?l=eurekalog.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=ja93QDMvHAc:JHmfi9PAfxY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=ja93QDMvHAc:JHmfi9PAfxY:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?i=ja93QDMvHAc:JHmfi9PAfxY:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=ja93QDMvHAc:JHmfi9PAfxY:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?i=ja93QDMvHAc:JHmfi9PAfxY:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=ja93QDMvHAc:JHmfi9PAfxY:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?i=ja93QDMvHAc:JHmfi9PAfxY:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=ja93QDMvHAc:JHmfi9PAfxY:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?i=ja93QDMvHAc:JHmfi9PAfxY:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=ja93QDMvHAc:JHmfi9PAfxY:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/EurekaLog/~4/ja93QDMvHAc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://eurekalog.blogspot.com/feeds/1045904516347758176/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://eurekalog.blogspot.com/2010/11/eurekalog-6025-is-out.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6789056281440007248/posts/default/1045904516347758176?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6789056281440007248/posts/default/1045904516347758176?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/EurekaLog/~3/ja93QDMvHAc/eurekalog-6025-is-out.html" title="EurekaLog 6.0.25 is out" /><author><name>Alex</name><uri>http://www.blogger.com/profile/02948908401998035458</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://2.bp.blogspot.com/_wZGXrlUYoJ4/TO-jvUZ7ckI/AAAAAAAAAAM/JLytgq1j4g0/S220/IMG_0774_184x184.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://eurekalog.blogspot.com/2010/11/eurekalog-6025-is-out.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkYARng6fCp7ImA9Wx9SEkk.&quot;"><id>tag:blogger.com,1999:blog-6789056281440007248.post-7297652537624668545</id><published>2010-07-27T13:43:00.007+01:00</published><updated>2010-12-01T22:55:47.614Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-12-01T22:55:47.614Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Delphi" /><category scheme="http://www.blogger.com/atom/ns#" term="EL 6.x" /><category scheme="http://www.blogger.com/atom/ns#" term="Releases" /><title>EurekaLog 6.0.24 is out</title><content type="html">We are pleased to announce the availability of the new 6.0.24 version.&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;div style="text-align: center;"&gt;
&lt;a href="http://www.eurekalog.com/" target="_blank" title="EurekaLog Logo"&gt;&lt;img alt="EurekaLog Logo" height="68" src="http://www.eurekalog.com/images/logo.png" width="295" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;blockquote&gt;
EurekaLog is a tool for Delphi and C++Builder that gives your application the power to catch every exception and memory leak, generating a detailed log of the call stack (with unit, procedure and line number), optionally sending you a copy of each log entry via email or the Web via the most used Web Bug-Tracking tools (as Mantis, BugZilla and FogBugz).&lt;/blockquote&gt;
EurekaLog represents the most advanced exception and memory leaks logger technology available for Delphi/C++Builder developers.&lt;br /&gt;
&lt;br /&gt;
To learn more about EurekaLog, please visit our website at:&lt;br /&gt;
&lt;a href="http://www.eurekalog.com/" target="_blank" title="http://www.eurekalog.com"&gt;http://www.eurekalog.com&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
To download a demo, please visit:&lt;br /&gt;
&lt;a href="http://www.eurekalog.com/downloads.php" target="_blank" title="http://www.eurekalog.com/downloads.php"&gt;http://www.eurekalog.com/downloads.php&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
If you would like to purchase a new license, please visit:&lt;br /&gt;
&lt;a href="http://www.eurekalog.com/buy.php" target="_blank" title="http://www.eurekalog.com/buy.php"&gt;http://www.eurekalog.com/buy.php&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;&lt;br /&gt;Upgrade policy:&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
If you would like to purchase an upgrade, this is our upgrade discount policy:&lt;br /&gt;
&lt;br /&gt;
1)...upgrade from any 4.x or 5.x to any 6.x - 50% discount;&lt;br /&gt;
2)...upgrade from a 6.x license type to another (ex: from a "Single Professional" to a "Corporate Professional") - the price difference.&lt;br /&gt;
&lt;br /&gt;
NOTE: the upgrade from an old 6.x version to the last released version is full free.&lt;br /&gt;
&lt;br /&gt;
Buy your upgrade or download your full version here:&lt;br /&gt;
&lt;a href="http://www.eurekalog.com/login.php" target="_blank" title="http://www.eurekalog.com/login.php"&gt;http://www.eurekalog.com/login.php&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;&lt;br /&gt;Changes:&lt;/strong&gt;&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;Added: ModuleInfoByAddr and ModuleInfoByHandle routines to improve EurekaLog usage with packages;&lt;/li&gt;
&lt;li&gt;Fixed: unable to save empty multi-line properties;&lt;/li&gt;
&lt;li&gt;Fixed: Mantis 1.2.1 login issue;&lt;/li&gt;
&lt;li&gt;Fixed: EurekaLog wasn't working with IntraWeb and C++ Builder 2010;&lt;/li&gt;
&lt;li&gt;Fixed: rare AV in BDS 2010;&lt;/li&gt;
&lt;li&gt;Fixed: changes date-time format while EurekaLog application running could break it;&lt;/li&gt;
&lt;li&gt;Fixed: splash screen is not large DPI aware;&lt;/li&gt;
&lt;li&gt;Fixed: fixed issue with missing wsock32.dll wrapper;&lt;/li&gt;
&lt;li&gt;Fixed: wrong encoding for saving some files in BDS 2009 and above;&lt;/li&gt;
&lt;li&gt;Fixed: Mantis encoding issues;&lt;/li&gt;
&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6789056281440007248-7297652537624668545?l=eurekalog.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=5CLwheMETxw:uB_kHTWjmrM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=5CLwheMETxw:uB_kHTWjmrM:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?i=5CLwheMETxw:uB_kHTWjmrM:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=5CLwheMETxw:uB_kHTWjmrM:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?i=5CLwheMETxw:uB_kHTWjmrM:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=5CLwheMETxw:uB_kHTWjmrM:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?i=5CLwheMETxw:uB_kHTWjmrM:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=5CLwheMETxw:uB_kHTWjmrM:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?i=5CLwheMETxw:uB_kHTWjmrM:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=5CLwheMETxw:uB_kHTWjmrM:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/EurekaLog/~4/5CLwheMETxw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://eurekalog.blogspot.com/feeds/7297652537624668545/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://eurekalog.blogspot.com/2010/07/eurekalog-6024-is-out.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6789056281440007248/posts/default/7297652537624668545?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6789056281440007248/posts/default/7297652537624668545?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/EurekaLog/~3/5CLwheMETxw/eurekalog-6024-is-out.html" title="EurekaLog 6.0.24 is out" /><author><name>Александр Алексеев</name><uri>https://profiles.google.com/113168002104297556003</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-aUMttZQBsuI/AAAAAAAAAAI/AAAAAAAAC3Y/QuZ7K9t_WzE/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://eurekalog.blogspot.com/2010/07/eurekalog-6024-is-out.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ck8MRXkzfip7ImA9Wx9TF0U.&quot;"><id>tag:blogger.com,1999:blog-6789056281440007248.post-6563481538948316473</id><published>2010-06-08T17:06:00.004+01:00</published><updated>2010-11-26T14:14:44.786Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-11-26T14:14:44.786Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Delphi" /><category scheme="http://www.blogger.com/atom/ns#" term="best practice" /><title>SDN sessions from EurekaLab s.a.s.</title><content type="html">&lt;a title="SDN Event 18 May 2010" href="http://www.sdn.nl/SDN/SDNEvent/SDNEventMei2010/tabid/160/Default.aspx" target="_blank"&gt;There was a SDN event recently - 18th May 2010&lt;/a&gt;. Fabio Dell'Aria took two sessions on this event: "How to find the exception source line of a just delivered software" and "How to prevent source code bugs and speed-up the testing phase".&lt;br/&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br/&gt;I had prepared two presentations for these sessions in OpenOffice Impress and some accompanied text in OpenOffice Writer for this event. And I thought that you may be interested in those materials, so I decided to publish them.&lt;br/&gt;&lt;br/&gt;You can download both sessions in one archive &lt;a title="Download &amp;quot;SDN Sessions 2010.zip&amp;quot; (275 Kb)" href="http://dl.dropbox.com/u/201788/Web/Files/SDN%20Sessions%202010.zip"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6789056281440007248-6563481538948316473?l=eurekalog.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=LbC8ZJsvd_M:E06k92qIkZA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=LbC8ZJsvd_M:E06k92qIkZA:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?i=LbC8ZJsvd_M:E06k92qIkZA:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=LbC8ZJsvd_M:E06k92qIkZA:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?i=LbC8ZJsvd_M:E06k92qIkZA:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=LbC8ZJsvd_M:E06k92qIkZA:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?i=LbC8ZJsvd_M:E06k92qIkZA:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=LbC8ZJsvd_M:E06k92qIkZA:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?i=LbC8ZJsvd_M:E06k92qIkZA:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=LbC8ZJsvd_M:E06k92qIkZA:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/EurekaLog/~4/LbC8ZJsvd_M" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://eurekalog.blogspot.com/feeds/6563481538948316473/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://eurekalog.blogspot.com/2010/06/sdn-sessions-from-eurekalab-sas_08.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6789056281440007248/posts/default/6563481538948316473?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6789056281440007248/posts/default/6563481538948316473?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/EurekaLog/~3/LbC8ZJsvd_M/sdn-sessions-from-eurekalab-sas_08.html" title="SDN sessions from EurekaLab s.a.s." /><author><name>Alex</name><uri>http://www.blogger.com/profile/02948908401998035458</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://2.bp.blogspot.com/_wZGXrlUYoJ4/TO-jvUZ7ckI/AAAAAAAAAAM/JLytgq1j4g0/S220/IMG_0774_184x184.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://eurekalog.blogspot.com/2010/06/sdn-sessions-from-eurekalab-sas_08.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEAAQXs5fSp7ImA9Wx9SEkk.&quot;"><id>tag:blogger.com,1999:blog-6789056281440007248.post-6756739689658744043</id><published>2010-06-08T16:25:00.057+01:00</published><updated>2010-12-01T22:32:20.525Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-12-01T22:32:20.525Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Delphi" /><category scheme="http://www.blogger.com/atom/ns#" term="additional features" /><category scheme="http://www.blogger.com/atom/ns#" term="how-to" /><category scheme="http://www.blogger.com/atom/ns#" term="debugging" /><title>How to debug application's hang?</title><content type="html">Today’s article will cover different approaches to debugging of application’s hangs.&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
It contains six parts:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Preparations&lt;/strong&gt; – common actions for preparing for all debugging cases.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Delphi – &lt;/strong&gt;debugging hang with Delphi.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;EurekaLog&lt;/strong&gt; – debugging hang with EurekaLog.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Process Explorer&lt;/strong&gt; – debugging hang with Process Explorer.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Threads Snapshot&lt;/strong&gt; – debugging hang with Threads Snapshot.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A practical example&lt;/strong&gt; – example with artificial hang.&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- more --&gt;&lt;br /&gt;
&lt;h1&gt;Preparations&lt;/h1&gt;
Well, before you start actual debugging – you need to do some tasks first. First thing is: you need to add debug information to your project and make a build (not just compile). Different tools requires/supports different formats of debugging info, so just enable everything – so you don’t need to think about it :) This step is required, if you want to deal with human-readable sources and not some raw machine code and offsets.&lt;br /&gt;
&lt;br /&gt;
Okay, so you need to turn on these options on “Linking” page (Project/Options/Linking): "MAP file" - Detailed, "Debug Information" (it’s called "Include TD32 debug info" in old Delphi versions) - True, "Include remote debug symbols" - True:&lt;br /&gt;
&lt;br /&gt; 
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_9sWBW4MIeFk/TAzXjupa2aI/AAAAAAAABsU/_vbWIIexWKk/s1600/Enabling+debug+info.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="286" src="http://3.bp.blogspot.com/_9sWBW4MIeFk/TAzXjupa2aI/AAAAAAAABsU/_vbWIIexWKk/s400/Enabling+debug+info.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Apart from debug info, you should also enable "Stack Frames" and "Use Debug DCUs" options on "Compiling" page:&lt;br /&gt;
&lt;br /&gt; 
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_9sWBW4MIeFk/TA4xYIm_7OI/AAAAAAAABs8/1cqWuTUWZc0/s1600/Enabling+debugging+assist+options.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="280" src="http://4.bp.blogspot.com/_9sWBW4MIeFk/TA4xYIm_7OI/AAAAAAAABs8/1cqWuTUWZc0/s400/Enabling+debugging+assist+options.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Please, allow me not describe again, &lt;a href="/2009/04/optimal-project-settings_21.html" title="Optimal project settings"&gt;what these options are doing&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Don’t forget to make Build after changes. Obviously, if you have several projects (DLL, BPL, etc) – then you need to do the same thing for each project. Also note, if you’re building with run-time packages, you should disable them for debugging session, if it’s possible. Packages increase complexity of debugging significantly.&lt;br /&gt;
&lt;br /&gt;
&lt;h1&gt;Delphi&lt;/h1&gt;
You could think: "but I can’t reproduce this hang under debugger!" or "I do not have Delphi installed on that machine!". Wait a moment, don’t go to the next article’s item.&lt;br /&gt;
&lt;br /&gt;
First: you don’t need to run your application under Delphi. You can run your program as usual (without any debugger attached), work as much, as you need (few days?) – and wait, until it hang. Now you can attach Delphi’s debugger to hanged process and start debugging. Second: if you don’t have Delphi installed – you can use remote debugger. I won’t go into details here, as we have a lot things to do today, but it’s not hard task – refer to &lt;a href="http://docwiki.embarcadero.com/RADStudio/en/Overview_of_Remote_Debugging" title="Overview of Remote Debugging"&gt;Delphi’s help&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
So, you’ve run your application, it worked for some time and hanged. Now open Delphi, open your project and do Run/Attach to process command:&lt;br /&gt;
&lt;br /&gt; 
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_9sWBW4MIeFk/TAzne-X9rMI/AAAAAAAABsc/h0RpzK-jRgY/s1600/Run-Attach+to+process.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="265" src="http://3.bp.blogspot.com/_9sWBW4MIeFk/TAzne-X9rMI/AAAAAAAABsc/h0RpzK-jRgY/s320/Run-Attach+to+process.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt; 
Delphi’s debugger will connect to selected process and will set it on pause – by hitting breakpoint in special debugger’s service thread:&lt;br /&gt;
&lt;br /&gt; 
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_9sWBW4MIeFk/TAzopxrE5VI/AAAAAAAABsk/pu25m58g8VI/s1600/Debug+pause+after+attach.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="196" src="http://2.bp.blogspot.com/_9sWBW4MIeFk/TAzopxrE5VI/AAAAAAAABsk/pu25m58g8VI/s320/Debug+pause+after+attach.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
You can ignore that debugger’s thread – just open Threads window and select any of your threads for debugging. You can view call stacks, walk call stack, switch threads, analyze variables, do stepping and running, etc, etc – in other words: you may debug your application as usual. If there is debug information available – you can close CPU window and debug by using source code.&lt;br /&gt;
&lt;br /&gt;
Note, that you should use Windows Vista or above for debugging, if this is possible – that’s because these OS support new feature called “Wait Chain Traversal”. Delphi’s debugger is capable of using it, starting with Delphi 2009. So, if you’re using Delphi 2009 or above and Windows Vista or above – then you can see wait chain status in Threads window:&lt;br /&gt;
&lt;br /&gt; 
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_9sWBW4MIeFk/TAzqnfMNtpI/AAAAAAAABss/v91anNROZ2E/s1600/WCT+support+in+Delphi+2009.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="53" src="http://1.bp.blogspot.com/_9sWBW4MIeFk/TAzqnfMNtpI/AAAAAAAABss/v91anNROZ2E/s320/WCT+support+in+Delphi+2009.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt; 
&lt;br /&gt;
&lt;h1&gt;EurekaLog&lt;/h1&gt;
EurekaLog have anti-freeze feature. Well, I’ve already covered it in much details a long time ago in &lt;a href="/2009/03/eurekalogs-anti-freeze-feature.html" title="EurekaLog’s anti-freeze feature"&gt;a separate article&lt;/a&gt;. For this reason, I’ll not discuss it in details here, as there is a lot of other material to discuss.&lt;br /&gt;
&lt;br /&gt;
Short summary: this is a very convenient feature, if you can use it in your application. You can’t use it, if your main thread is not pumping messages (like console or service applications). The result is usual EurekaLog report with call stack and accompanied information, focusing on hanged thread. This feature is handy for letting you know about problems on client machines. It will report you about any hang on the field. But if you want to debug a reproducible hang – it’s better to use Delphi’s debugger, as shown above.&lt;br /&gt;
&lt;br /&gt;
&lt;h1&gt;Process Explorer&lt;/h1&gt;
If you can’t use Delphi for some reason – then the only thing left is manual debugging.&lt;br /&gt;
&lt;br /&gt;
You may use a &lt;a href="http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx" title="Technet: Process Explorer"&gt;Process Explorer&lt;/a&gt; tool for that. But before doing actual debugging, you need to do two steps. Both steps are optional, but highly recommended.&lt;br /&gt;
&lt;br /&gt;
Step one – setup system debug information in Process Explorer. Windows ships with raw binaries, which have their debug information stripped. We just enabled debug info for our project (see first article’s item), but how can we do the same thing for the Windows itself? Well, Microsoft is aware of that issue and it can give you debug info separately, if you ask for this. You can download this debug info and get you pretty human-readable call stacks.&lt;br /&gt;
&lt;br /&gt;
First you need to download and install &lt;a href="http://www.microsoft.com/whdc/DevTools/Debugging/default.mspx" title="Windows Debugging Tools"&gt;Windows Debugging Tools&lt;/a&gt;. Next, you need to make a choice: either &lt;a href="http://www.microsoft.com/whdc/devtools/debugging/symbolpkg.mspx#d" title="Download Windows Symbol Packages"&gt;you download all debug info at once in one package&lt;/a&gt; or you can download it by request for each executable. You may try the first approach, if you want, but I prefer the second way.&lt;br /&gt;
&lt;br /&gt;
You need to create a writable folder for the second way. And setup a Process Explorer of course (Options/Configure symbols):&lt;br /&gt;
&lt;br /&gt; 
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_9sWBW4MIeFk/TAzzX8k72XI/AAAAAAAABs0/CvDCkiNYWLg/s1600/Configuring+symbol+server+in+Process+Explorer.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="161" src="http://1.bp.blogspot.com/_9sWBW4MIeFk/TAzzX8k72XI/AAAAAAAABs0/CvDCkiNYWLg/s320/Configuring+symbol+server+in+Process+Explorer.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt; 
First edit specifies path to DbgHelp.dll – pick the one from installed Windows Debugging Tools.&lt;br /&gt;
&lt;br /&gt;
Second edit contains two things: first – your writable folder (it’s &lt;code&gt;C:\ProgramData\DebugSymbols&lt;/code&gt; for me, but I’ve added a “write” access to it), where you want to store debug info; second – a debug info server, which will serve your requests for new debug info (I’m using default Microsoft’s server: &lt;code&gt;http://msdl.microsoft.com/download/symbols&lt;/code&gt;).&lt;br /&gt;
&lt;br /&gt;
After setting these things, Process Explorer will start to use debug information for system binaries. It will ask server for appropriate version of debug info and cache (store) it in the specified folder. So, you may see a "Loading symbols for ABC.exe+0xXYZ..." text while watching threads or call stacks.&lt;br /&gt;
&lt;br /&gt;
Step two – you need to convert your map-file to some other format. The reason: Delphi generates several debug info formats, but all of them are Borland-related. Process Explorer, being a Microsoft’s tool, can accept a range of Microsoft’s formats, but not Borland’s ones. You can do this by using &lt;a href="http://code.google.com/p/map2dbg/" title="Google Code: map2dbg project"&gt;map2dbg tool&lt;/a&gt;. This is a simple console utility. Download, unpack, open cmd and write:
&lt;pre&gt;map2dbg Project1.exe&lt;/pre&gt;
This tool will use Project1.exe and Project1.map to create a Project1.dbg, which can be used by Microsoft’s tools.&lt;br /&gt;
&lt;br /&gt;
Well, I’ve just said a lot of things. Now I need to show you, what you’ll gain from all this stuff. So, here are 3 screenshots below. Walk from top to bottom: call stack without both steps (no system’s and no project’s debug info), call stack with first step only (system’s debug info present, project’s debug info is not), and call stack with both steps completed (both system’s and project’s debug info are available):&lt;br /&gt;
&lt;br /&gt; 
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_9sWBW4MIeFk/TA4yGmXAD2I/AAAAAAAABtE/kV-40u-UyeY/s1600/Call+stack+-+no+debug+info.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="139" src="http://3.bp.blogspot.com/_9sWBW4MIeFk/TA4yGmXAD2I/AAAAAAAABtE/kV-40u-UyeY/s200/Call+stack+-+no+debug+info.png" width="200" /&gt;&lt;/a&gt;&lt;a href="http://2.bp.blogspot.com/_9sWBW4MIeFk/TA4yMAcVjlI/AAAAAAAABtM/1nwoff-bkbs/s1600/Call+stack+-+system+debug+info.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="155" src="http://2.bp.blogspot.com/_9sWBW4MIeFk/TA4yMAcVjlI/AAAAAAAABtM/1nwoff-bkbs/s200/Call+stack+-+system+debug+info.png" width="200" /&gt;&lt;/a&gt;&lt;a href="http://2.bp.blogspot.com/_9sWBW4MIeFk/TA4yRB-1y3I/AAAAAAAABtU/YFsSC9wWA8g/s1600/Call+stack+-+system+and+project+debug+info.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="153" src="http://2.bp.blogspot.com/_9sWBW4MIeFk/TA4yRB-1y3I/AAAAAAAABtU/YFsSC9wWA8g/s200/Call+stack+-+system+and+project+debug+info.png" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt; 
So, as you can see, enabling debug info gives you 3 things:
&lt;ul&gt;
&lt;li&gt;More readable call stack (you got &lt;em&gt;module!routine+offset&lt;/em&gt; instead of just &lt;em&gt;module+offset&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;More full call stack (tracing heuristic may filter out calls without accessible debug info for validating entry)&lt;/li&gt;
&lt;li&gt;More meaningful call stack (analyzer may show you the wrong function name without debug info – if code calls internal function, which have no name, but there is a public function with name nearby)&lt;/li&gt;
&lt;/ul&gt;
Okat, looks like we’re done. As you can see, it’s a loot better with debug info than without it :)&lt;br /&gt;
&lt;br /&gt;
Now, what exactly should you do with Process Explorer? Well, you should run your application and let it hang. Now, you run Process Explorer, select your process, right click on it –&amp;gt; Properties, and select Threads tab in properties window:&lt;br /&gt;
&lt;br /&gt; 
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_9sWBW4MIeFk/TA40ZqoYVuI/AAAAAAAABtc/tG99nuJVM4o/s1600/Threads+tab+in+Process+Explorer.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;" &gt;&lt;img border="0" height="400" src="http://3.bp.blogspot.com/_9sWBW4MIeFk/TA40ZqoYVuI/AAAAAAAABtc/tG99nuJVM4o/s400/Threads+tab+in+Process+Explorer.png" width="327" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Here you can watch your threads, what they are doing, who eats CPU, who is waiting for something, etc. You can select a thread and hit "Stack" button to view this thread’s call stack (see three screenshots above for example).&lt;br /&gt;
&lt;br /&gt;
Of course, you can’t view variables or something like that – only states and execution points of threads. So you need to use your psychic powers to figure out what’s going on. It’s harder, than debugging in Delphi, but possible.&lt;br /&gt;
&lt;br /&gt;
&lt;h1&gt;Threads Snapshot&lt;/h1&gt;
Well, using Process Explorer though not that hard, but sure doesn’t look as piece-a-cake for beginner (and especially for customer!). There is a lot of work and a lot of new concepts. Honestly saying, all this mess with debug info is not very convenient, isn’t it? So I decided to write &lt;a href="http://www.eurekalog.com/files/ThreadsSnapshot.zip" title="Download ThreadsSnapshot.zip (688 Kb)"&gt;a small and simple tool&lt;/a&gt;, which allows you to select a process and it will dump all information about threads to text file. This information includes:
&lt;ul&gt;
&lt;li&gt;Basic info: ID, priority, etc.&lt;/li&gt;
&lt;li&gt;Call stack. Tool supports the following sources: Borland-related, JCL, EurekaLog and madExcept. I’ll add support for Microsoft and download-at-request (as Process Explorer does) a bit later.&lt;/li&gt;
&lt;li&gt;Wait Chain Traversal information (on Windows Vista and above only).&lt;/li&gt;
&lt;li&gt;Thread’s context – CPU’s registers and flags.&lt;/li&gt;
&lt;/ul&gt;
So, you run your application and let it hang again. Now you run Threads snapshot tool and pick your hanged process. The tool will capture information and dump it into text log, which you can analyze.&lt;br /&gt;
&lt;br /&gt;
User interface:&lt;br /&gt;
&lt;br /&gt; 
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_9sWBW4MIeFk/TA43BtPiEBI/AAAAAAAABtk/fJ8y7gVLEbw/s1600/Threads+snapshot+tool.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="316" src="http://1.bp.blogspot.com/_9sWBW4MIeFk/TA43BtPiEBI/AAAAAAAABtk/fJ8y7gVLEbw/s320/Threads+snapshot+tool.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt; 
Resulting log file:&lt;br /&gt;
&lt;pre&gt;Process [ 147C / 5244 ]: H:\Test\Project88.exe (2010.06.08 16:31:07)
[ 18C4 / 6340 ] Priority: 8
Wait Chain Count = 1; Deadlock: False
Type: Thread; status: Blocked; process: [ 147C / 5244 ]; thread: [ 18C4 / 6340 ]; wait time: 701985; context switches: 4040
EIP:    772E438D  EFlags: 00000202
EBP:    0018FF1C  ESP:    0018FEEC
EAX:    000100B8  EBX:    0008E301  ECX:    00000000  EDX:    00000000ESI:    00000000  EDI:    0018FEE4
SegCS:  00000023  CegSS:  0000002B  SegGS:  0000002B  SegFS:  00000053  SegES:  0000002B  SegDS:  0000002B
----------------------------------------------------------------------------------------------------------------------------------------------
|Methods |Details|Stack   |Address |Module       |Unit     |Class    |Procedure/Method                                             |Line     |
----------------------------------------------------------------------------------------------------------------------------------------------
|Calling Thread: ID=6340; Priority=??; Class=                                                                                                |
|--------------------------------------------------------------------------------------------------------------------------------------------|
|00000008|03     |00000000|772E438D|user32.dll   |USER32   |         |WaitMessage                                                  |         |
|000000F2|04     |0018FF20|0049F5CC|Project88.exe|Forms    |Forms    |TApplication.Idle                                            |10358[0] |
|000000F2|04     |0018FF20|0049E8FF|Project88.exe|Forms    |Forms    |TApplication.HandleMessage                                   |9814[23] |
|000000F2|04     |0018FF44|0049E8E8|Project88.exe|Forms    |Forms    |TApplication.HandleMessage                                   |9813[0]  |
|000000F2|04     |0018FF44|0049EC1D|Project88.exe|Forms    |Forms    |TApplication.Run                                             |9951[201]|
|000000F2|04     |0018FF74|0049EB54|Project88.exe|Forms    |Forms    |TApplication.Run                                             |9925[0]  |
|000000F2|04     |0018FF74|004A6C91|Project88.exe|Project88|Project88|Project88                                                    |13[73]   |
|000000F2|03     |0018FF8C|770D3675|kernel32.dll |kernel32 |         |BaseThreadInitThunk                                          |         |
|000000F2|03     |0018FF98|77B29D70|ntdll.dll    |ntdll    |         |Unknown function at 77B29D70 near RtlInitializeExceptionChain|         |
|000000F2|03     |0018FFD8|77B29D4B|ntdll.dll    |ntdll    |         |Unknown function at 77B29D4B near RtlInitializeExceptionChain|         |
|000000F2|03     |0018FFD8|77B29D40|ntdll.dll    |ntdll    |         |Unknown function at 77B29D40 near RtlInitializeExceptionChain|         |
----------------------------------------------------------------------------------------------------------------------------------------------

[ 1834 / 6196 ] Priority: 8
Wait Chain Count = 1; Deadlock: False
Type: Thread; status: Blocked; process: [ 147C / 5244 ]; thread: [ 1834 / 6196 ]; wait time: 720156; context switches: 2
EIP:    77B100FD  EFlags: 00000202
EBP:    02F7FF88  ESP:    02F7FDF4
EAX:    77B51C7F  EBX:    77B51C20  ECX:    00000000  EDX:    00000000ESI:    006B7C60  EDI:    00000000
SegCS:  00000023  CegSS:  0000002B  SegGS:  0000002B  SegFS:  00000053  SegES:  0000002B  SegDS:  0000002B
-----------------------------------------------------------------------------------------------------------------------------------
|Methods |Details|Stack   |Address |Module      |Unit    |Class|Procedure/Method                                             |Line|
-----------------------------------------------------------------------------------------------------------------------------------
|Calling Thread: ID=6196; Priority=??; Class=                                                                                     |
|---------------------------------------------------------------------------------------------------------------------------------|
|00000008|03     |00000000|77B100FD|ntdll.dll   |ntdll   |     |ZwWaitForMultipleObjects                                     |    |
|000000F2|03     |02F7FF8C|770D3675|kernel32.dll|kernel32|     |BaseThreadInitThunk                                          |    |
|000000F2|03     |02F7FF98|77B29D70|ntdll.dll   |ntdll   |     |Unknown function at 77B29D70 near RtlInitializeExceptionChain|    |
|000000F2|03     |02F7FFD8|77B29D4B|ntdll.dll   |ntdll   |     |Unknown function at 77B29D4B near RtlInitializeExceptionChain|    |
|000000F2|03     |02F7FFD8|77B29D40|ntdll.dll   |ntdll   |     |Unknown function at 77B29D40 near RtlInitializeExceptionChain|    |
-----------------------------------------------------------------------------------------------------------------------------------&lt;/pre&gt;
As you can see, this is a tiny and convenient alternative to using Process Explorer tool. You can even ask your customer to capture snapshot for you. Just don’t forget to transfer all necessary files (like map-files).&lt;br /&gt;
&lt;br /&gt;
I’ve just wrote this tools for a two days. So it’s a bit untested. I think that fixed version of this tool may appear in EurekaLog v7.&lt;br /&gt;
&lt;br /&gt;
&lt;h1&gt;A practical example&lt;/h1&gt;
I’ve also wrote &lt;a href="http://www.eurekalog.com/files/HandDemo.zip" title="Download HandDemo.zip (785 Кб)"&gt;a simple test application&lt;/a&gt; with two buttons. You can use it as training example. First button creates several threads, which deadlock due to circular waiting. Second button creates a memory corruption, which leads to hang. Run this example, hit any button and try to figure out a reason for hang. See if you can debug these cases.&lt;br /&gt;
&lt;br /&gt;
Using Delphi: if you have WCT support – than it’s piece-a-cake to debug first case: just run application, hit button, put application on pause and look on Threads window:&lt;br /&gt;
&lt;br /&gt; 
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_9sWBW4MIeFk/TA5MQgPi1II/AAAAAAAABts/sJ6pp_b__E4/s1600/Deadlock+1+in+Delphi+with+WCT.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="80" src="http://1.bp.blogspot.com/_9sWBW4MIeFk/TA5MQgPi1II/AAAAAAAABts/sJ6pp_b__E4/s400/Deadlock+1+in+Delphi+with+WCT.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
You’ll see a problem immediately. You have 3 threads (ignore last thread – it’s debugger’s thread, not yours). The main thread (a first one) waits for worker thread (a second one) to complete. Second thread issues a SendMessage call, which targets last thread (third). Third thread handles the message, but it needs capture critical section, which is owner by second thread. Here is a deadlock: second thread waits third thread and third thread waits second thread.&lt;br /&gt;
&lt;br /&gt;
If you don’t have WCT available – then you need to do this analysis manually. You need to switch between threads and see their call stacks:&lt;br /&gt;
&lt;br /&gt; 
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_9sWBW4MIeFk/TA5NHMuxyMI/AAAAAAAABt0/ljt124kbWvE/s1600/Deadlock+1+in+Delphi+without+WCT.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="126" src="http://2.bp.blogspot.com/_9sWBW4MIeFk/TA5NHMuxyMI/AAAAAAAABt0/ljt124kbWvE/s400/Deadlock+1+in+Delphi+without+WCT.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Right after switching to thread – there will be CPU window with current machine instruction. You can ignore it and click on some call stack items to view source code instead.&lt;br /&gt;
&lt;br /&gt;
You can reconstruct situation by analyzing call stacks of all three threads.&lt;br /&gt;
&lt;br /&gt;
How the same situation looks in Process Explorer and Threads snapshot tools? Well, you can run Process Explorer and see call stacks for threads:&lt;br /&gt;
&lt;br /&gt; 
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_9sWBW4MIeFk/TA5N2HVY6ZI/AAAAAAAABt8/yuQpPRTfqyo/s1600/Deadlock+1+in+Process+Explorer.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;" &gt;&lt;img  border="0" height="307" src="http://1.bp.blogspot.com/_9sWBW4MIeFk/TA5N2HVY6ZI/AAAAAAAABt8/yuQpPRTfqyo/s400/Deadlock+1+in+Process+Explorer.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
You don’t see line numbers here – but at least you see routine names and their sequence. For example, note &lt;code&gt;Thread1Func&lt;/code&gt;, dispatch-like, &lt;code&gt;CriticalSection.Aquire&lt;/code&gt;, etc routines in the screenshot above. And again: you look at call stacks of all threads and trying to reconstruct the situation. It will be harder than using Delphi (you don’t see variables and line number), but (using a certain amount of psychic powers) possible.&lt;br /&gt;
&lt;br /&gt;
Considering Threads snapshot – it produces such log (I cut some unimportant details to minimize size):&lt;br /&gt;
&lt;pre&gt;Process [ 1A1C / 6684 ]: H:\Test\HangDemo.exe (2010.06.08 17:54:33)
[ 1BD8 / 7128 ] Priority: 8
Wait Chain Count = 7; Deadlock: TrueType: Thread; status: Blocked; process: [ 1A1C / 6684 ]; thread: [ 1BD8 / 7128 ]; wait time: 1038023; context switches: 762
Type: Unknown; status: Owned; name: " "; timeout: 0; alertable: 0
Type: Unknown; status: Unknown; name: " "; timeout: 0; alertable: 0
Type: Unknown; status: Unknown; name: ""; timeout: 0; alertable: 0
Type: Unknown; status: Unknown; name: ""; timeout: 0; alertable: 0
Type: Unknown; status: Unknown; name: ""; timeout: 0; alertable: 0
Type: Unknown; status: Unknown; name: ""; timeout: 0; alertable: 0
EIP:    77B0F871  EFlags: 00000202
EBP:    0018F438  ESP:    0018F3CCEAX:    00000000  EBX:    00000000  ECX:    00000000  EDX:    00000000ESI:    00000120  EDI:    00000000
SegCS:  00000023  CegSS:  0000002B  SegGS:  0000002B  SegFS:  00000053  SegES:  0000002B  SegDS:  0000002B
----------------------------------------------------------------------------------------------------------------------------------------------
|Methods |Details|Stack   |Address |Module        |Unit      |Class   |Procedure/Method                                           |Line      |
----------------------------------------------------------------------------------------------------------------------------------------------
|Calling Thread: ID=7128; Priority=??; Class=                                                                                                |
|--------------------------------------------------------------------------------------------------------------------------------------------|
|00000008|03     |00000000|77B0F871|ntdll.dll     |ntdll     |        |ZwWaitForSingleObject                                      |          |
|000000F2|03     |0018F43C|7757077E|KERNELBASE.dll|KERNELBASE|        |WaitForSingleObjectEx                                      |          |
|000000F2|03     |0018F43C|770D117F|kernel32.dll  |kernel32  |        |WaitForSingleObjectEx                                      |          |
|000000F2|03     |0018F454|770D1141|kernel32.dll  |kernel32  |        |WaitForSingleObjectEx                                      |          |
|000000F2|03     |0018F454|770D1133|kernel32.dll  |kernel32  |        |WaitForSingleObject                                        |          |
|000000F2|03     |0018F468|770D1126|kernel32.dll  |kernel32  |        |WaitForSingleObject                                        |          |
|000000F2|04     |0018F468|004B3580|HangDemo.exe  |UnitMain  |UnitMain|TfmMain.Button1Click                                       |101[68]   |
|000000F2|04     |0018F47C|0048331F|HangDemo.exe  |Controls  |Controls|TControl.Click                                             |7178[111] |
----------------------------------------------------------------------------------------------------------------------------------------------

[ 065C / 1628 ] Priority: 8
Wait Chain Count = 5; Deadlock: TrueType: Thread; status: Blocked; process: [ 1A1C / 6684 ]; thread: [ 065C / 1628 ]; wait time: 1038024; context switches: 34
Type: Unknown; status: No access; name: " "; timeout: 0; alertable: 0
Type: Unknown; status: Unknown; name: " "; timeout: 0; alertable: 0
Type: Unknown; status: Unknown; name: ""; timeout: 0; alertable: 0
Type: Unknown; status: Unknown; name: ""; timeout: 0; alertable: 0
EIP:    77B0F871  EFlags: 00000202
EBP:    0237FD40  ESP:    0237FCDC
EAX:    00000000  EBX:    00000000  ECX:    00000000  EDX:    00000000ESI:    006293C4  EDI:    00000000
SegCS:  00000023  CegSS:  0000002B  SegGS:  0000002B  SegFS:  00000053  SegES:  0000002B  SegDS:  0000002B
-------------------------------------------------------------------------------------------------------------------------------------------
|Methods |Details|Stack   |Address |Module      |Unit    |Class   |Procedure/Method                                             |Line     |
-------------------------------------------------------------------------------------------------------------------------------------------
|Calling Thread: ID=1628; Priority=??; Class=                                                                                             |
|-----------------------------------------------------------------------------------------------------------------------------------------|
|00000008|03     |00000000|77B0F871|ntdll.dll   |ntdll   |        |ZwWaitForSingleObject                                        |         |
|000000F2|03     |0237FD44|77B28B9A|ntdll.dll   |ntdll   |        |Unknown function at 77B28B9A near RtlIntegerToUnicodeString  |         |
|000000F2|03     |0237FD44|77B28B43|ntdll.dll   |ntdll   |        |Unknown function at 77B28B43 near RtlIntegerToUnicodeString  |         |
|000000F2|03     |0237FD6C|77B12260|ntdll.dll   |ntdll   |        |RtlEnterCriticalSection                                      |         |
|000000F2|04     |0237FD6C|00441408|HangDemo.exe|SyncObjs|SyncObjs|TCriticalSection.Acquire                                     |546[4]   |
|000000F2|04     |0237FD74|004B3354|HangDemo.exe|UnitMain|UnitMain|WndProc                                                      |43[20]   |
|000000F2|03     |0237FDA8|772D6215|user32.dll  |USER32  |        |Unknown function at 772D6215 near gapfnScSendMessage         |         |
|000000F2|03     |0237FDA8|772D68E5|user32.dll  |USER32  |        |Unknown function at 772D68E5 near gapfnScSendMessage         |         |
|000000F2|03     |0237FDEC|772D6893|user32.dll  |USER32  |        |Unknown function at 772D6893 near gapfnScSendMessage         |         |
|000000F2|03     |0237FE20|772D682D|user32.dll  |USER32  |        |Unknown function at 772D682D near gapfnScSendMessage         |         |
|000000F2|03     |0237FE20|772D7172|user32.dll  |USER32  |        |Unknown function at 772D7172 near GetWindowLongW             |         |
|000000F2|03     |0237FEA8|772D682D|user32.dll  |USER32  |        |Unknown function at 772D682D near gapfnScSendMessage         |         |
|000000F2|03     |0237FEA8|772D7D2C|user32.dll  |USER32  |        |Unknown function at 772D7D2C near LoadStringW                |         |
|000000F2|03     |0237FEF0|772D7E2C|user32.dll  |USER32  |        |DispatchMessageW                                             |         |
|000000F2|03     |0237FEF0|772D7EB8|user32.dll  |USER32  |        |GetMessageW                                                  |         |
|000000F2|03     |0237FF0C|772D7E92|user32.dll  |USER32  |        |GetMessageW                                                  |         |
|000000F2|04     |0237FF0C|004B3420|HangDemo.exe|UnitMain|UnitMain|Thread1Func                                                  |71[132]  |
|000000F2|04     |0237FF78|00405FE4|HangDemo.exe|System  |System  |ThreadWrapper                                                |13579[40]|
|000000F2|03     |0237FF8C|770D3675|kernel32.dll|kernel32|        |BaseThreadInitThunk                                          |         |
|000000F2|03     |0237FF98|77B29D70|ntdll.dll   |ntdll   |        |Unknown function at 77B29D70 near RtlInitializeExceptionChain|         |
|000000F2|03     |0237FFD8|77B29D4B|ntdll.dll   |ntdll   |        |Unknown function at 77B29D4B near RtlInitializeExceptionChain|         |
|000000F2|03     |0237FFD8|77B29D40|ntdll.dll   |ntdll   |        |Unknown function at 77B29D40 near RtlInitializeExceptionChain|         |
-------------------------------------------------------------------------------------------------------------------------------------------

[ 1504 / 5380 ] Priority: 8
Wait Chain Count = 5; Deadlock: TrueType: Thread; status: Blocked; process: [ 1A1C / 6684 ]; thread: [ 1504 / 5380 ]; wait time: 1038024; context switches: 8
Type: Unknown; status: Running; name: " "; timeout: 0; alertable: 0
Type: Unknown; status: Unknown; name: " "; timeout: 0; alertable: 0
Type: Unknown; status: Unknown; name: ""; timeout: 0; alertable: 0
Type: Unknown; status: Unknown; name: ""; timeout: 0; alertable: 0
EIP:    772D723B  EFlags: 00000202
EBP:    03C1FF28  ESP:    03C1FEE8
EAX:    00BD2C30  EBX:    005E0EC0  ECX:    00000000  EDX:    00000000ESI:    00BD2C30  EDI:    00000401
SegCS:  00000023  CegSS:  0000002B  SegGS:  0000002B  SegFS:  00000053  SegES:  0000002B  SegDS:  0000002B
-------------------------------------------------------------------------------------------------------------------------------------------
|Methods |Details|Stack   |Address |Module      |Unit    |Class   |Procedure/Method                                             |Line     |
-------------------------------------------------------------------------------------------------------------------------------------------
|Calling Thread: ID=5380; Priority=??; Class=                                                                                             |
|-----------------------------------------------------------------------------------------------------------------------------------------||00000008|03     |00000000|772D723B|user32.dll  |USER32  |        |Unknown function at 772D723B near GetPropW                   |         |
|000000F2|03     |03C1FF2C|772DCC02|user32.dll  |USER32  |        |Unknown function at 772DCC02 near GetWindow                  |         |
|000000F2|03     |03C1FF2C|772DCD7C|user32.dll  |USER32  |        |SendMessageW                                                 |         |
|000000F2|03     |03C1FF50|772DCD35|user32.dll  |USER32  |        |SendMessageW                                                 |         |
|000000F2|04     |03C1FF50|004B350F|HangDemo.exe|UnitMain|UnitMain|Thread2Func                                                  |85[67]   |
|000000F2|04     |03C1FF78|00405FE4|HangDemo.exe|System  |System  |ThreadWrapper                                                |13579[40]|
|000000F2|03     |03C1FF8C|770D3675|kernel32.dll|kernel32|        |BaseThreadInitThunk                                          |         |
|000000F2|03     |03C1FF98|77B29D70|ntdll.dll   |ntdll   |        |Unknown function at 77B29D70 near RtlInitializeExceptionChain|         |
|000000F2|03     |03C1FFD8|77B29D4B|ntdll.dll   |ntdll   |        |Unknown function at 77B29D4B near RtlInitializeExceptionChain|         |
|000000F2|03     |03C1FFD8|77B29D40|ntdll.dll   |ntdll   |        |Unknown function at 77B29D40 near RtlInitializeExceptionChain|         |
-------------------------------------------------------------------------------------------------------------------------------------------&lt;/pre&gt;
Unfortunately, WCT output is not very well formatted yet (that’s my home-work! :) ), but you still can track wait chains. Besides, there are call stacks for threads (without system debug info – that’s my second home-task!), which strongly hint what is happening.&lt;br /&gt;
&lt;br /&gt;
Nothing extremely hard here.&lt;br /&gt;
&lt;br /&gt;
The second case is significantly harder. Because hang is not an error here – it’s just a consequence of &lt;strong&gt;another problem&lt;/strong&gt;.&lt;br /&gt;
&lt;br /&gt;
Okay, so you run application in Delphi and it hangs, so we put it on pause. We have only one thread, so WCT won’t give you any useful hints, even if it’s available. So we switch to main thread and analyze call stack:&lt;br /&gt;
&lt;br /&gt; 
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_9sWBW4MIeFk/TA5PlcNw-aI/AAAAAAAABuE/WzYY1lGu2Og/s1600/Deadlock+2+in+Delphi.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="189" src="http://2.bp.blogspot.com/_9sWBW4MIeFk/TA5PlcNw-aI/AAAAAAAABuE/WzYY1lGu2Og/s320/Deadlock+2+in+Delphi.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt; 
And again: by clicking on call stack’s items we can see source code.&lt;br /&gt;
&lt;br /&gt;
But analyzing call stack only is not enough this time. It’s unclear what happened. And application seems even not hanging – it’s doing something. That’s why we start doing single-step debugging to see, what application is doing. After walking a bunch of lines, we discover that application is busy doing some cycle with Sleep inside. This cycle constantly checking some flag. We can see that this code belongs to FastMM. And by reading comments, we realize that FastMM is trying to acquire some kind of lock. The flag is “busy/free” switch. Since FastMM is checking this flag for an hour - at this point it becomes clear that something isn’t right. Besides, we have only one thread in application – there is nobody else, who can be waited for. In other words, the state of flag is no longer corresponds to reality. I.e. it’s corrupted.&lt;br /&gt;
&lt;br /&gt;
Unfortunately, resolving memory corruption is not that easy work and it’s another a big and separate topic, which &lt;a href="/2010/03/memory-problems-in-delphi-apps-final_30.html" title="Memory problems in Delphi applications - final article"&gt;I’ve finished discussing not so long ago&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
So, the task of this case is to find the reason. We’ve found it: it’s a memory corruption problem. So, our hang analysis is done, but the problem is not identified yet and isn’t solved. So, the next step is analyzing for memory problems.&lt;br /&gt;
&lt;br /&gt;
Actually, this second case looks the same in all tools: we get the same call stack, which can vary from time to time, but it will point to Sleep in 99% of cases. So we just check it few times, see the same values and suppose endless cycle here. We analyze, why there can be endless cycle and make an educated guess about memory problems. Here is example of the same call stack in Process Explorer:&lt;br /&gt;
&lt;br /&gt; 
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_9sWBW4MIeFk/TA5UyXgJciI/AAAAAAAABuM/bQMqHSPenkY/s1600/Deadlock+2+in+Process+Explorer.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;" &gt;&lt;img border="0" height="227" src="http://3.bp.blogspot.com/_9sWBW4MIeFk/TA5UyXgJciI/AAAAAAAABuM/bQMqHSPenkY/s400/Deadlock+2+in+Process+Explorer.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Okay, I’m done for today. Hope that you’ve enjoyed today’s lesson.&lt;br /&gt;
&lt;br /&gt;
P.S. If you want – there is an additional bit of information: how to get source line from pointer/address – see "How to find the exception source line" session &lt;a href="/2010/06/sdn-sessions-from-eurekalab-sas_08.html" title="SDN sessions from EurekaLab s.a.s."&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6789056281440007248-6756739689658744043?l=eurekalog.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=p_AZlIPC4Ow:MjtsP1Ukvsk:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=p_AZlIPC4Ow:MjtsP1Ukvsk:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?i=p_AZlIPC4Ow:MjtsP1Ukvsk:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=p_AZlIPC4Ow:MjtsP1Ukvsk:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?i=p_AZlIPC4Ow:MjtsP1Ukvsk:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=p_AZlIPC4Ow:MjtsP1Ukvsk:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?i=p_AZlIPC4Ow:MjtsP1Ukvsk:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=p_AZlIPC4Ow:MjtsP1Ukvsk:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?i=p_AZlIPC4Ow:MjtsP1Ukvsk:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=p_AZlIPC4Ow:MjtsP1Ukvsk:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/EurekaLog/~4/p_AZlIPC4Ow" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://eurekalog.blogspot.com/feeds/6756739689658744043/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://eurekalog.blogspot.com/2010/06/how-to-debug-applications-hang.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6789056281440007248/posts/default/6756739689658744043?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6789056281440007248/posts/default/6756739689658744043?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/EurekaLog/~3/p_AZlIPC4Ow/how-to-debug-applications-hang.html" title="How to debug application's hang?" /><author><name>Alex</name><uri>http://www.blogger.com/profile/02948908401998035458</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://2.bp.blogspot.com/_wZGXrlUYoJ4/TO-jvUZ7ckI/AAAAAAAAAAM/JLytgq1j4g0/S220/IMG_0774_184x184.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_9sWBW4MIeFk/TAzXjupa2aI/AAAAAAAABsU/_vbWIIexWKk/s72-c/Enabling+debug+info.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://eurekalog.blogspot.com/2010/06/how-to-debug-applications-hang.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0cGQXk8eyp7ImA9Wx9SEk4.&quot;"><id>tag:blogger.com,1999:blog-6789056281440007248.post-5142620843649662640</id><published>2010-05-05T16:25:00.032+01:00</published><updated>2010-12-01T19:17:00.773Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-12-01T19:17:00.773Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Delphi" /><category scheme="http://www.blogger.com/atom/ns#" term="other tools" /><category scheme="http://www.blogger.com/atom/ns#" term="how it works" /><category scheme="http://www.blogger.com/atom/ns#" term="additional features" /><title>New Exception class in Delphi 2009 and above</title><content type="html">&lt;code&gt;Exception&lt;/code&gt; class from &lt;code&gt;SysUtils&lt;/code&gt; unit is a base class for all exceptions in your application. It wasn't changed since Delphi 2, if I remember correctly. But now, it got new properties and, thus, new features - starting with Delphi 2009 and above. So, I decided to give an overview of new capabilities of &lt;code&gt;Exception&lt;/code&gt; class.&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
Okay, in Delphi 2007 and below, the &lt;code&gt;Exception&lt;/code&gt; class looks like this:
&lt;pre class="brush:delphi"&gt;type
  Exception = class(TObject)
  // ...
  public
    // All constructors below are just different variants of filling Message and HelpContext properties
    constructor Create(const Msg: string);
    // ...
    property HelpContext: Integer read FHelpContext write FHelpContext;
    property Message: string read FMessage write FMessage;
  end;&lt;/pre&gt;
&lt;br /&gt;
Actually, we have only a textual description of the problem here - &lt;code&gt;Message&lt;/code&gt; property (&lt;code&gt;HelpContext&lt;/code&gt; is barely used on practice). Of course, we can declare a new custom class, where we can add anything we like, but don't you think that base &lt;code&gt;Exception&lt;/code&gt; class could be a more useful? How about information about previous exception?&lt;br /&gt;
&lt;br /&gt;
Well, nevertheless, the &lt;code&gt;Exception&lt;/code&gt; class has changed in Delphi 2009 (doh, finally!) by acquiring new properties and methods:&lt;br /&gt;
&lt;pre class="brush:delphi"&gt;type
  Exception = class(TObject)
  // ...
  protected
    procedure SetInnerException;
    procedure SetStackInfo(AStackInfo: Pointer);
    function GetStackTrace: string;
    procedure RaisingException(P: PExceptionRecord); virtual;
  public
    constructor Create(const Msg: string);
    // ...
    function GetBaseException: Exception; virtual;
    function ToString: string; override;
    property BaseException: Exception read GetBaseException;
    property HelpContext: Integer read FHelpContext write FHelpContext;
    property InnerException: Exception read FInnerException;
    property Message: string read FMessage write FMessage;
    property StackTrace: string read GetStackTrace;
    property StackInfo: Pointer read FStackInfo;
  class var
    GetExceptionStackInfoProc: function (P: PExceptionRecord): Pointer;
    GetStackInfoStringProc: function (Info: Pointer): string;
    CleanUpStackInfoProc: procedure (Info: Pointer);
    class procedure RaiseOuterException(E: Exception); static;
    class procedure ThrowOuterException(E: Exception); static;
  end;&lt;/pre&gt;
All new things belongs to one of the following categories:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Nested exceptions support&lt;/li&gt;
&lt;li&gt;Exception tracing support&lt;/li&gt;
&lt;/ul&gt;
Let's deal with them individually.&lt;br /&gt;
&lt;br /&gt;
&lt;h1&gt;Nested exceptions&lt;/h1&gt;
Nested exception (sometimes called "chained exception") appears in situations, when new exception is raised, while your code processes another exception - i.e. if there is exception in exception handler (finally or except block). If you don't have support for nested exceptions - then old exception will be lost. Sometimes, it's what you want anyway, but sometimes it's not.&lt;br /&gt;
&lt;br /&gt;
Two examples. A first one:
&lt;pre class="brush:delphi"&gt;procedure TSomeClass.SaveToStream(const AStream: Stream);
begin
  try
    // ... saving instance to stream here
  except
    raise ESomeClassSaveError.Create('Error saving data to stream');
  end;
end;&lt;/pre&gt;
I think that this example is quite clear. We raise high-level error (&lt;code&gt;ESomeClassSaveError&lt;/code&gt;) from low-level error (it can be plain &lt;code&gt;EStreamError&lt;/code&gt; due to out of disk space or something more tricky like range error or access violation due to damage of internal instance's state). Anyway, the user will get his description - and that was our target. However, note that information about original issue is lost, as high-level exception masked low-level one.&lt;br /&gt;
&lt;br /&gt;
In this example, we've raised exception by ourself, as expected one. In the next example, this will be unexpected event.&lt;br /&gt;
&lt;br /&gt;
Example two:
&lt;pre class="brush:delphi"&gt;  SomeClass := TSomeClass.Create;
  try
    // ... suppose that there is some exception here
  finally
    FreeAndNil(SomeClass); // suppose that SomeClass's destructor raises exception too
  end;&lt;/pre&gt;
In this example, we didn't expect exception to happen. We got unexpected exception in destructor of &lt;code&gt;SomeClass&lt;/code&gt; instance. It may be some access violation, because we wasn't prepared for something. Similar to previous example: the new exception hides previous one, but we don't want it in this case - we want original exception, so we can fix it. We can only fix the second one without this information, which won't solve original problem.&lt;br /&gt;
&lt;br /&gt;
Anyway, in both examples we leak important information: an information about previous exception, which can give us hints to the problem. And it is when nested exceptions appears.&lt;br /&gt;
&lt;br /&gt;
The new exception class (whoa, that sure took a lot of time, but I should introduce newbies to nested exceptions after all) have &lt;code&gt;InnerException&lt;/code&gt; and &lt;code&gt;BaseException&lt;/code&gt; properties. Both properties are set (managed) by &lt;code&gt;SysUtils&lt;/code&gt; unit automatically, you don't need to fill them manually. So, you can read and use them. &lt;code&gt;InnerException&lt;/code&gt; property stores the previous exception. &lt;code&gt;BaseException&lt;/code&gt; stores exception with most nested level - i.e. the very first exception, which started this exception chain. If there are only two exceptions in the chain (old and new, as in examples above), then &lt;code&gt;InnerException&lt;/code&gt; will be equal to &lt;code&gt;BaseException&lt;/code&gt;. If there is only one exception (i.e. there is no nested exception at all) - then both properties will be equal to nil.&lt;br /&gt;
&lt;br /&gt;
Nested exceptions, however, aren't saved by default. In order to save nested exception, you need to raise new exceptions via &lt;code&gt;Exception.RaiseOuterException&lt;/code&gt; (Delphi's style) or &lt;code&gt;Exception.ThrowOuterException&lt;/code&gt; (C++ Builder's style). For example:&lt;br /&gt;
&lt;pre class="brush:delphi"&gt;procedure TSomeClass.SaveToStream(const AStream: Stream);
begin
  try
    // ... saving instance to stream here
  except
    Exception.RaiseOuterException(ESomeClassSaveError.Create('Error saving data to stream'));
  end;
end;&lt;/pre&gt;
After executing this code, we will get exception of &lt;code&gt;ESomeClassSaveError&lt;/code&gt; class, which will have non-nil &lt;code&gt;InnerException&lt;/code&gt; property (and &lt;code&gt;BaseException&lt;/code&gt; too), which, in turn, will contain original exception (&lt;code&gt;EStreamError&lt;/code&gt; or whatever it was).&lt;br /&gt;
&lt;br /&gt;
In the second example (the one with exception in destructor) we still get &lt;code&gt;InnerException&lt;/code&gt; = nil, cause RaiseOuterException isn't used anywhere.&lt;br /&gt;
&lt;br /&gt;
How this support of nested exceptions affects error messages? Well, &lt;code&gt;Message&lt;/code&gt; property didn't changed - it's a message of current exception only. So, any code, which isn't awared about nested exceptions, will show only message of the last exception. You can use &lt;code&gt;ToString&lt;/code&gt; method of &lt;code&gt;Exception&lt;/code&gt; class to show all messages from all exceptions - each exception will be on new line (obviously, &lt;code&gt;ToString&lt;/code&gt; will be equal to &lt;code&gt;Message&lt;/code&gt; property in case of single exception in the chain).&lt;br /&gt;
&lt;br /&gt;
On the other side, &lt;code&gt;Application.ShowException&lt;/code&gt; method looks a bit strange: this method shows message from &lt;code&gt;BaseException&lt;/code&gt; - I suppose that it's not what you want (see our first example). That's why I think that you may want to make your own &lt;code&gt;Application.OnException&lt;/code&gt; event handler to change this behaviour. For example:
&lt;pre class="brush:delphi"&gt;procedure TForm1.ApplicationEvents1Exception(Sender: TObject; E: Exception);
var
  Msg: String;
begin
  Msg := E.Message; // or E.ToString
  Application.MessageBox(PChar(Msg), PChar(Application.Title), MB_OK + MB_ICONSTOP);
end;&lt;/pre&gt;
The next thing: I really don't understand, why there is no way to enable capturing of nested exceptions in each case, without need to use special raising routines. If you want this feature - you may add the following unit to your uses clause (&lt;b&gt;attention: this is a hack, not documented way&lt;/b&gt;):
&lt;pre class="brush:delphi"&gt;unit ChainedExceptionsAlways;

interface

implementation

uses
  SysUtils;

var
  OldRaiseExceptObject: Pointer;

type
  EExceptionHack = class
  public
    FMessage: string;
    FHelpContext: Integer;
    FInnerException: Exception;
    FStackInfo: Pointer;
    FAcquireInnerException: Boolean;
  end;

procedure RaiseExceptObject(P: PExceptionRecord);
type
  TRaiseExceptObjectProc = procedure(P: PExceptionRecord);
begin
  if TObject(P^.ExceptObject) is Exception then
    EExceptionHack(P^.ExceptObject).FAcquireInnerException := True;

  if Assigned(OldRaiseExceptObject) then
    TRaiseExceptObjectProc(OldRaiseExceptObject)(P);
end;

initialization
  OldRaiseExceptObject := RaiseExceptObjProc;
  RaiseExceptObjProc := @RaiseExceptObject;
end.&lt;/pre&gt;
After you add this unit (the sooner - the better) - our second example will start to collect previous exceptions too, and you can use either &lt;code&gt;Exception.RaiseOuterException&lt;/code&gt; or just raise in the first example - the behaviour will be the same.&lt;br /&gt;
&lt;br /&gt;
&lt;h1&gt;Exception tracing&lt;/h1&gt;
Well, if you read our blog from time to time or if you're using EurekaLog - you're already familiar with exception tracers, so I'll skip introduction here, but I still want to briefly describe architecture of exception tracers to show how new properties of new &lt;code&gt;Exception&lt;/code&gt; class fit in this picture.&lt;br /&gt;
&lt;br /&gt;
Application is set of machine's codes, which are just numbers in bytes. By default, there is no reference to source code in the compiled application. That's why you can't built a human-readable call stack. So, you need to use some solution, which do the following:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Embeds debug information (reference between raw code and sources) into compiled application in public or proprietary format.&lt;/li&gt;
&lt;li&gt;Installs hook on exception's raising (i.e. hook on any function, which is called when exception occurs). This includes patching of something (import table or code's section).&lt;/li&gt;
&lt;li&gt;Builds a call stack in the hook handler by using any stack tracing method.&lt;/li&gt;
&lt;/ul&gt;
There is no problem with first and third item - they are documented and acceptable solutions. Item two is different, as it includes using of dirty hacks. That's why, Delphi's developers have added support for exception tracers in &lt;code&gt;Exception&lt;/code&gt; class to simplify things here (it's a bit late, but late is still better, than never). All that this support do - it allows you to call your routine at exception raise, removing need to hook/patch binary. Nothing more, nothing less. In other words, there is no way to get exception tracing in Delphi out of the box.&lt;br /&gt;
&lt;br /&gt;
One more time: &lt;em&gt;this new feature is designed for developers of exception tracers&lt;/em&gt;.&lt;br /&gt;
&lt;br /&gt;
Since all already written exception tracers already works somehow - they do not use this new feature, that's why, if you want to get exception's call stack, then you need to call appropriate function of exception tracer. For example, it's &lt;code&gt;GetLastExceptionCallStack&lt;/code&gt; for EurekaLog and &lt;code&gt;JclLastExceptStackList&lt;/code&gt; for JCL.&lt;br /&gt;
&lt;br /&gt;
However, you can integrate any existing exception tracer into this new architecture - and this task is quite simple. If your exception tracer consists of distinct modules, you can turn off that part, which is responsible for hooking, leaving only stack tracing and debug information parts.&lt;br /&gt;
&lt;br /&gt;
Okay, so if you've decided that you want it, here is how you can do it.&lt;br /&gt;
&lt;br /&gt;
First thing is that the mentioned support includes &lt;code&gt;System&lt;/code&gt; and &lt;code&gt;SysUtils&lt;/code&gt; units. All base functionality is included into &lt;code&gt;System&lt;/code&gt; unit - similar to old features of exceptions. &lt;code&gt;SysUtils&lt;/code&gt; unit is just a convenient "wrapper" for &lt;code&gt;System&lt;/code&gt; unit's functionality. &lt;code&gt;System&lt;/code&gt; unit provides certain events (&lt;code&gt;ExceptProc&lt;/code&gt;, &lt;code&gt;ErrorProc&lt;/code&gt;, &lt;code&gt;ExceptClsProc&lt;/code&gt;, &lt;code&gt;ExceptObjProc&lt;/code&gt;, &lt;code&gt;RaiseExceptionProc&lt;/code&gt;, &lt;code&gt;RTLUnwindProc&lt;/code&gt;, &lt;code&gt;RaiseExceptObjProc&lt;/code&gt;, &lt;code&gt;ExceptionAcquired&lt;/code&gt;, &lt;code&gt;ExceptionClass&lt;/code&gt;, &lt;code&gt;SafeCallErrorProc&lt;/code&gt;, &lt;code&gt;AssertErrorProc&lt;/code&gt; and &lt;code&gt;AbstractErrorProc&lt;/code&gt;), which &lt;code&gt;SysUtils&lt;/code&gt; unit uses. You should not use these events, until you throw out &lt;code&gt;SysUtils&lt;/code&gt; unit. Instead, use &lt;code&gt;SysUtils&lt;/code&gt;'s services.&lt;br /&gt;
&lt;br /&gt;
So, what &lt;code&gt;SysUtils&lt;/code&gt; unit can offer us? It offers a new &lt;code&gt;Exception&lt;/code&gt; class, which have new events like &lt;code&gt;GetExceptionStackInfoProc&lt;/code&gt;, &lt;code&gt;GetStackInfoStringProc&lt;/code&gt; and &lt;code&gt;CleanUpStackInfoProc&lt;/code&gt;. They aren't used by anyone by default - as I said, it's impossible to implement them, as default application doesn't have information for that.&lt;br /&gt;
&lt;br /&gt;
This means that it's we, who need to implement these handlers. Since we don't write exception tracer, but use already existing one - we only need to write a wrapper. Wrapper will just call appropriate function from exception tracer, that's all. For example:&lt;br /&gt;
&lt;pre class="brush:delphi"&gt;unit ExceptionEurekaLogSupport;

interface

implementation

uses
  SysUtils, Classes, ExceptionLog;

function GetExceptionStackInfoEurekaLog(P: PExceptionRecord): Pointer;
const
  cDelphiException = $0EEDFADE;
var
  Stack: TEurekaStackList;
  Str: TStringList;
  Trace: String;
  Sz: Integer;
  DI: PEurekaDebugInfo;
begin
  Stack := GetCurrentCallStack;
  try
    New(DI);
    DI^.ModuleInfo := ModuleInfoByAddr(Cardinal(P^.ExceptAddr));
    if P^.ExceptionCode = cDelphiException then
      GetSourceInfoByAddr(Cardinal(P^.ExceptAddr), DI)
    else
      GetSourceInfoByAddr(Cardinal(P^.ExceptionAddress), DI);
    Stack.Insert(0, DI);

    Str := TStringList.Create;
    try
      CallStackToStrings(Stack, Str);
      Trace := Str.Text;
    finally
      FreeAndNil(Str);
    end;
  finally
    FreeAndNil(Stack);
  end;

  if Trace &amp;lt;&amp;gt; '' then
  begin
    Sz := (Length(Trace) + 1) * SizeOf(Char);
    GetMem(Result, Sz);
    Move(Pointer(Trace)^, Result^, Sz);
  end
  else
    Result := nil;
end;

function GetStackInfoStringEurekaLog(Info: Pointer): string;
begin
  Result := PChar(Info);
end;

procedure CleanUpStackInfoEurekaLog(Info: Pointer);
begin
  FreeMem(Info);
end;

initialization
  Exception.GetExceptionStackInfoProc := GetExceptionStackInfoEurekaLog;
  Exception.GetStackInfoStringProc := GetStackInfoStringEurekaLog;
  Exception.CleanUpStackInfoProc := CleanUpStackInfoEurekaLog;
end.&lt;/pre&gt;
And here is variant for JCL:
&lt;pre class="brush:delphi"&gt;unit ExceptionJCLSupport;

interface

implementation

uses
  SysUtils, Classes, JclDebug;

function GetExceptionStackInfoJCL(P: PExceptionRecord): Pointer;
const
  cDelphiException = $0EEDFADE;
var
  Stack: TJclStackInfoList;
  Str: TStringList;
  Trace: String;
  Sz: Integer;
begin
  if P^.ExceptionCode = cDelphiException then
    Stack := JclCreateStackList(False, 3, P^.ExceptAddr)
  else
    Stack := JclCreateStackList(False, 3, P^.ExceptionAddress);
  try
    Str := TStringList.Create;
    try
      Stack.AddToStrings(Str, True, True, True, True);
      Trace := Str.Text;
    finally
      FreeAndNil(Str);
    end;
  finally
    FreeAndNil(Stack);
  end;

  if Trace &amp;lt;&amp;gt; '' then
  begin
    Sz := (Length(Trace) + 1) * SizeOf(Char);
    GetMem(Result, Sz);
    Move(Pointer(Trace)^, Result^, Sz);
  end
  else
    Result := nil;
end;

function GetStackInfoStringJCL(Info: Pointer): string;
begin
  Result := PChar(Info);
end;

procedure CleanUpStackInfoJCL(Info: Pointer);
begin
  FreeMem(Info);
end;

initialization
  Exception.GetExceptionStackInfoProc := GetExceptionStackInfoJCL;
  Exception.GetStackInfoStringProc := GetStackInfoStringJCL;
  Exception.CleanUpStackInfoProc := CleanUpStackInfoJCL;
end.&lt;/pre&gt;
Depending on the exception tracer that you use - you need to include either one of these units into uses clause (the sooner - the better) and you'll magically have your stack traces.&lt;br /&gt;
&lt;br /&gt;
Use the following example of &lt;code&gt;OnException&lt;/code&gt; handler to verify that it's working (note that you need to turn on RTL handlers calling and turn off EurekaLog's dialog in EurekaLog options):
&lt;pre class="brush:delphi"&gt;procedure TForm1.ApplicationEvents1Exception(Sender: TObject; E: Exception);
var
  Msg, Stack: String;
  Inner: Exception;
begin
  Inner := E;
  Msg := '';
  while Inner &amp;lt;&amp;gt; nil do
  begin
    if Msg &amp;lt;&amp;gt; '' then
      Msg := Msg + sLineBreak;
    Msg := Msg + Inner.Message;
    if (Msg &amp;lt;&amp;gt; '') and (Msg[Length(Msg)] &amp;gt; '.') then
      Msg := Msg + '.';

    Stack := Inner.StackTrace;
    if Stack &amp;lt;&amp;gt; '' then
    begin
      if Msg &amp;lt;&amp;gt; '' then
        Msg := Msg + sLineBreak + sLineBreak;
      Msg := Msg + Stack + sLineBreak;
    end;

    Inner := Inner.InnerException;
  end;
  Application.MessageBox(PChar(Msg), PChar(Application.Title), MB_OK + MB_ICONSTOP);
end;&lt;/pre&gt;
Let's see example. The following code:
&lt;pre class="brush:delphi; first-line: 56"&gt;procedure TForm1.Button1Click(Sender: TObject);
begin
  try
    PInteger(nil)^ := 0;
  except
    Exception.RaiseOuterException(Exception.Create('Error occured'));
  end;
end;&lt;/pre&gt;
will produce the following message box:
&lt;pre&gt;Error occured.

(000A7D0F){Project68.exe} [004A8D0F] Unit1.TForm1.Button1Click (Line 61, "Unit1.pas" + 4) + $16
(00004901){Project68.exe} [00405901] System.@RaiseExcept (Line 12194, "System.pas" + 47) + $0
(00076473){Project68.exe} [00477473] Controls.TControl.Click (Line 7178, "Controls.pas" + 9) + $8
(0007A7CC){Project68.exe} [0047B7CC] Controls.TWinControl.WndProc (Line 9819, "Controls.pas" + 144) + $6
(00057BE4){Project68.exe} [00458BE4] StdCtrls.TButtonControl.WndProc (Line 4377, "StdCtrls.pas" + 13) + $4
(0007A91F){Project68.exe} [0047B91F] Controls.DoControlMsg (Line 9888, "Controls.pas" + 12) + $11
(0007A7CC){Project68.exe} [0047B7CC] Controls.TWinControl.WndProc (Line 9819, "Controls.pas" + 144) + $6
(0009AC94){Project68.exe} [0049BC94] Forms.TCustomForm.WndProc (Line 3960, "Forms.pas" + 191) + $5
(00079E6C){Project68.exe} [0047AE6C] Controls.TWinControl.MainWndProc (Line 9540, "Controls.pas" + 3) + $6
(0003DC58){Project68.exe} [0043EC58] Classes.StdWndProc (Line 13014, "Classes.pas" + 8) + $0
(0007A8CC){Project68.exe} [0047B8CC] Controls.TWinControl.DefaultHandler (Line 9860, "Controls.pas" + 30) + $17
(0007A7CC){Project68.exe} [0047B7CC] Controls.TWinControl.WndProc (Line 9819, "Controls.pas" + 144) + $6
(00057BE4){Project68.exe} [00458BE4] StdCtrls.TButtonControl.WndProc (Line 4377, "StdCtrls.pas" + 13) + $4
(0003DC58){Project68.exe} [0043EC58] Classes.StdWndProc (Line 13014, "Classes.pas" + 8) + $0

Access violation at address 004A8CE8 in module 'Project1.exe'. Write of address 00000000.

(000A7CE8){Project68.exe} [004A8CE8] Unit1.TForm1.Button1Click (Line 59, "Unit1.pas" + 2) + $4
(0000453F){Project68.exe} [0040553F] System.@HandleAnyException (Line 11245, "System.pas" + 13) + $0
(00076473){Project68.exe} [00477473] Controls.TControl.Click (Line 7178, "Controls.pas" + 9) + $8
(0007A7CC){Project68.exe} [0047B7CC] Controls.TWinControl.WndProc (Line 9819, "Controls.pas" + 144) + $6
(00057BE4){Project68.exe} [00458BE4] StdCtrls.TButtonControl.WndProc (Line 4377, "StdCtrls.pas" + 13) + $4
(0007A91F){Project68.exe} [0047B91F] Controls.DoControlMsg (Line 9888, "Controls.pas" + 12) + $11
(0007A7CC){Project68.exe} [0047B7CC] Controls.TWinControl.WndProc (Line 9819, "Controls.pas" + 144) + $6
(0009AC94){Project68.exe} [0049BC94] Forms.TCustomForm.WndProc (Line 3960, "Forms.pas" + 191) + $5
(00079E6C){Project68.exe} [0047AE6C] Controls.TWinControl.MainWndProc (Line 9540, "Controls.pas" + 3) + $6
(0003DC58){Project68.exe} [0043EC58] Classes.StdWndProc (Line 13014, "Classes.pas" + 8) + $0
(0007A8CC){Project68.exe} [0047B8CC] Controls.TWinControl.DefaultHandler (Line 9860, "Controls.pas" + 30) + $17
(0007A7CC){Project68.exe} [0047B7CC] Controls.TWinControl.WndProc (Line 9819, "Controls.pas" + 144) + $6
(00057BE4){Project68.exe} [00458BE4] StdCtrls.TButtonControl.WndProc (Line 4377, "StdCtrls.pas" + 13) + $4
(0003DC58){Project68.exe} [0043EC58] Classes.StdWndProc (Line 13014, "Classes.pas" + 8) + $0&lt;/pre&gt;
Also note, that (in case of JCL) we do not use hooking code (which is located in &lt;code&gt;JclHookExcept&lt;/code&gt; unit), since new Exception class takes care of that for us. We only use JCL's features on stack tracing and debug information (which are located in &lt;code&gt;JclDebug&lt;/code&gt; unit).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6789056281440007248-5142620843649662640?l=eurekalog.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=s0GP0Ys2CVY:DwtyYJdgfK4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=s0GP0Ys2CVY:DwtyYJdgfK4:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?i=s0GP0Ys2CVY:DwtyYJdgfK4:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=s0GP0Ys2CVY:DwtyYJdgfK4:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?i=s0GP0Ys2CVY:DwtyYJdgfK4:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=s0GP0Ys2CVY:DwtyYJdgfK4:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?i=s0GP0Ys2CVY:DwtyYJdgfK4:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=s0GP0Ys2CVY:DwtyYJdgfK4:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?i=s0GP0Ys2CVY:DwtyYJdgfK4:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=s0GP0Ys2CVY:DwtyYJdgfK4:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/EurekaLog/~4/s0GP0Ys2CVY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://eurekalog.blogspot.com/feeds/5142620843649662640/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://eurekalog.blogspot.com/2010/05/new-exception-class-in-delphi-2009-and_05.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6789056281440007248/posts/default/5142620843649662640?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6789056281440007248/posts/default/5142620843649662640?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/EurekaLog/~3/s0GP0Ys2CVY/new-exception-class-in-delphi-2009-and_05.html" title="New Exception class in Delphi 2009 and above" /><author><name>Alex</name><uri>http://www.blogger.com/profile/02948908401998035458</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://2.bp.blogspot.com/_wZGXrlUYoJ4/TO-jvUZ7ckI/AAAAAAAAAAM/JLytgq1j4g0/S220/IMG_0774_184x184.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://eurekalog.blogspot.com/2010/05/new-exception-class-in-delphi-2009-and_05.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEAFQHY6eyp7ImA9Wx9SEkk.&quot;"><id>tag:blogger.com,1999:blog-6789056281440007248.post-1403245971666436391</id><published>2010-03-30T16:26:00.059+01:00</published><updated>2010-12-01T22:31:51.813Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-12-01T22:31:51.813Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Delphi" /><category scheme="http://www.blogger.com/atom/ns#" term="other tools" /><category scheme="http://www.blogger.com/atom/ns#" term="tips" /><category scheme="http://www.blogger.com/atom/ns#" term="how-to" /><category scheme="http://www.blogger.com/atom/ns#" term="memory leaks" /><category scheme="http://www.blogger.com/atom/ns#" term="best practice" /><category scheme="http://www.blogger.com/atom/ns#" term="EL 6.x" /><title>Memory problems in Delphi apps - final article</title><content type="html">I've published several articles already, which cover different aspects of memory's issues. I'm going to give a short review of these articles first and then finish this series with current article. If you didn't read my previous articles or if you're a newbie - I recommend to read them from first to last before you'll start reading this one.&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
Okay, back to our series, here comes it's&lt;br /&gt;
&lt;br /&gt;
&lt;h1&gt;Contents&lt;/h1&gt;
1. &lt;a href="http://rvelthuis.de/articles/articles-pointers.html" title="Addressing pointers"&gt;Introducing article about pointers&lt;/a&gt; (and here is a separate &lt;a href="http://rvelthuis.de/articles/articles-pchars.html" title="PChars: no strings attached"&gt;article about strings&lt;/a&gt;). Well, these are not my articles, but it's great and well-written ones, so I'll just use a link to them. These article discuss pointers, reference types and many other things, which you should know about &lt;strong&gt;before&lt;/strong&gt; you'll start debugging your memory problems.&lt;br /&gt;
&lt;br /&gt;
2. &lt;a href="/2009/04/optimal-project-settings_21.html" title="Optimal project settings"&gt;Preparations&lt;/a&gt;. Tools for diagnosing memory issues require certain environment and conditions. You can improve (or make worse) their results by adjusting the options of your projects. That's why, before advancing any further, this article explains various debugging options and their affect on your application. There are also listed options sets for typical use cases (note, those are only recommendations). Well, this article is optional, if you already have a memory issue, but do not suffer from low detalization of your bug report (assuming you have it at all).&lt;br /&gt;
&lt;br /&gt;
3. &lt;a href="/2009/05/access-violation-in-details_12.html" title="Access Violation in details"&gt;&lt;/code&gt;EAccessViolation&lt;/code&gt; exception&lt;/a&gt;. This exception (as, probably, most common one in Delphi) may have various reasons, but all reasons have something in common: they all are the memory problems. This article explains what this exception is, examines examples of its reasons, and studies how can you diagnose and fix it - either by debugging manually or by using debugging tools. As it becomes clear to the end of article, the &lt;code&gt;EAccessViolation&lt;/code&gt; exception is actually a &lt;strong&gt;blessing&lt;/strong&gt; - because it allows you to spot (and react on) the problem immediately. The article provides an example of how the same code can lead (depending on external conditions) either to exception ("good"), to the application's crash/data corruption ("bad"), or even to normal operation, although the code still has a bug ("very bad"). The article discusses only the first case - an obvious exception, and leaves other cases for later (this article).&lt;br /&gt;
&lt;br /&gt;
4. &lt;a href="/2009/05/catching-memory-leaks_26.html" title="Catching memory leaks"&gt;Memory leaks&lt;/a&gt;. Though I'm talking about memory leaks in this article, my real target is to introduce memory managers and their debug mode. I've mentioned this at the beginning of the article - namely, that leak searching is actually close related to debugging memory corruptions. I've concentrated on leaks only in this article, saving other interesting questions for later (this article again).&lt;br /&gt;
&lt;br /&gt;
5. (off-topic 1) &lt;a href="/2009/07/how-to-read-bug-reports_28.html" title="How to read bug reports"&gt;How to read bug reports&lt;/a&gt;. This article is not related to this series about memory issues, but I think it's worth to mention it. Apparently, many beginners have difficulties with reading/understanding bug reports, which are generated by different debugging tools, mentioned in previous articles. So, this article tries to explain, how you should read reports and to discuss typical mistakes in interpreting reports.&lt;br /&gt;
&lt;br /&gt;
6. (off-topic 2) &lt;a href="/2010/02/catching-memory-leaks-redux_16.html" title="Catching memory leaks, redux"&gt;Add-on&lt;/a&gt; to my article about memory leaks. Well, it looks like many people have used my first article about memory leaks for its most obvious purpose: catching mem-leaks&amp;nbsp;;) Apparently, original article wasn't good enough for this purpose, because there were many additional questions from people about it. Well, may be it is not that surprising, if you recall that original purpose was to introduce debugging memory managers. That's why I've decided to write an add-on, which covers missed topics. This add-on wasn't commented well, but we're receiving much less questions about mem-leaks, so I think that it hit the spot.&lt;br /&gt;
&lt;br /&gt;
7. &lt;a href="/memory-problems-in-delphi-apps-final-article/" title="Memory problems in Delphi apps - final article"&gt;This article&lt;/a&gt;. I've only mentioned most scary problems in the previous articles, dealing with simple cases first and leaving hard cases for later. Now it's time to deal with them, therefore finishing the series. To put it short: if you have strange issues with crashes, empty reports (apart most obvious case of low-detailed debug info) or hangs - this article is for you (note: sometimes hang can be caused by memory corruption too: &lt;a href="http://qc.embarcadero.com/wc/qcmain.aspx?d=76832" title="QC Report #76832"&gt;example&lt;/a&gt;).&lt;br /&gt;
&lt;br /&gt;
Now, I've made a review of this series, so we can get back to this article itself:&lt;br /&gt;
&lt;br /&gt;
&lt;h1&gt;When EurekaLog can not help you (or: what we will talk about)&lt;/h1&gt;
Note: when I say "EurekaLog" - I actually mean any similar tool, like &lt;code&gt;JclHookExcept&lt;/code&gt;, madExcept, WER, etc.&lt;br /&gt;
&lt;br /&gt;
EurekaLog is a tool for debugging your application. It is not a "silver bullet", which magically solves any of your problem. Like every tool, EurekaLog have the purpose, the scope and the limitations. That's why there are cases, when this great tool can not help you.&lt;br /&gt;
&lt;br /&gt;
The problem is that each tool requires some basics to function. You break this basis - you broke the tool. And there is no way a tool can escape that. Well, usually it's hard thing to do. But it is possible and it even may be not so hard, if you mis-use pointers and memory usage. I've already gave examples of simple code that can crash your application and nobody will do a thing about it (see, for example, the end of "Looking for the Access Violation’s reason by analyzing the code" block in &lt;a href="/2009/05/access-violation-in-details_12.html" title="Access violation in details"&gt;this article&lt;/a&gt;).&lt;br /&gt;
&lt;br /&gt;
So, all those scary problems, which make your debugging tools useless, are all memory issues. Namely: &lt;strong&gt;memory corruption&lt;/strong&gt;. Any tool need to store its data somewhere. If a bug in your application damages or even erase this data - the game is over. Even more: the code can trash not only tool's data, but app's critical data too - like return addresses or saved pointers to exception handlers. You may already noticed that most hard cases includes &lt;strong&gt;stack corruption&lt;/strong&gt;. That's because critical data (which you can affect at all from user-mode) is stored in application's stack.&lt;br /&gt;
&lt;br /&gt;
Well, some of memory corruption problems (apparently, not so hardest ones) can be even detected by EurekaLog. EurekaLog tries to create an simplified version of the bug report in that case and to display the following message:&lt;br /&gt;
&lt;br /&gt; 
  &lt;a href="http://lh5.ggpht.com/_9sWBW4MIeFk/S7B99ET4RrI/AAAAAAAAAm0/f799gjYuzgs/s1600-h/InternalError%5B1%5D.png"&gt;&lt;img border="0" height="280" src="http://lh6.ggpht.com/_9sWBW4MIeFk/S7B99m-3xKI/AAAAAAAAAm4/Urw__lJMvhE/InternalError_thumb.png?imgmax=800" style="border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: block; float: none; margin-left: auto; margin-right: auto;" width="558" /&gt;&lt;/a&gt;&lt;br /&gt; 
As you can see, EurekaLog thinks that this is its fault, though most common case is it's somebody else's fault. EurekaLog says so, because it have encounter a problem during its work on exception handling. But this problem may be caused either a bug in EurekaLog or a bug in other code (may be yours, may be not).&lt;br /&gt;
&lt;br /&gt;
EurekaLog suggests you to send this report to EurekaLog's developers. If you agree, it will open your default e-mail client with such report (example):&lt;br /&gt;
&lt;pre&gt;Version   : 6.0.23
Date      : Sat, 27 Mar 2010 13:09:00 +0300
OS        : Microsoft Windows 7 (64 bit)
RAD       : BDS 7.0
Dump      : $89 $10 $8B $45 $94 $8B $40 $08 $48 $85 $C0 $7C $7B $40 $89 $85 $30 $FF $FF $FF $C7 $85 $38 $FF $FF $FF $00 $00 $00 $00 $8B $95
Section   : 16
LastExcept: Exception
Address   : $004A7FE6 - [00400000] Project38.exe - ExceptionLog.pas -  - InternalExceptNotify - 14540[484]
Exception : EAccessViolation
Message   : Access violation at address 004A7FE6 in module 'Project38.exe'. Write of address 00000000
Call Stack: 00 $00419534 - [00400000] Project38.exe - SysUtils.pas - Exception - Create - 17419[0]
            01 $00515E63 - [00400000] Project38.exe - Unit39.pas - TForm39 - Button1Click - 29[1]
            02 $004A6E6C - [00400000] Project38.exe - ExceptionLog.pas -  - InternalExceptNotify - 14056[0]
            03 $004A879A - [00400000] Project38.exe - ExceptionLog.pas - TExceptionThread - Execute - 14689[2]
            04 $0043E7DA - [00400000] Project38.exe - Classes.pas -  - ThreadProc - 11018[8]
            05 $0040667C - [00400000] Project38.exe - System.pas -  - ThreadWrapper - 13579[33]
            06 $76EF3675 - [76EE0000] kernel32.dll
            07 $77C89D70 - [77C50000] ntdll.dll
            08 $77C89D4B - [77C50000] ntdll.dll
            09 $77C89D40 - [77C50000] ntdll.dll&lt;/pre&gt;
This is a short version of bug report for fatal errors. Sure, you should send us such reports - however, if you see that the problem in question is &lt;strong&gt;access violation&lt;/strong&gt; or &lt;strong&gt;invalid pointer&lt;/strong&gt; exceptions - this means &lt;strong&gt;memory corruption problem in your application&lt;/strong&gt;. Which means that you better check your application very carefully, as in most cases such reports indicate problem in your or 3rd party code and not in EurekaLog. Either way, if you think that this is definitely a problem with EurekaLog - be prepare for long conversation with developers. That's because memory corruption problem can't be fixed from one report. Report can only indicate it. To fix it - additional work is required.&lt;br /&gt;
&lt;br /&gt;
It's worth to note, that EurekaLog integrates itself into Delphi's IDE, hooking all IDE exceptions too. I.e. EurekaLog catches not only errors in your applications, but in Delphi too. This is useful feature for old Delphi's version, which do not have similar feature. New Delphis come with their own tool for automatic reporting - so you may want to disable this EurekaLog behaviour. In any case - you can turn off or on this behaviour in "EurekaLog"/"EurekaLog IDE Options" menu:&lt;br /&gt;
&lt;br /&gt; 
&lt;a href="http://lh3.ggpht.com/_9sWBW4MIeFk/S7B9-NvCDDI/AAAAAAAAAm8/6qc06Ku366w/s1600-h/EurekaLog%20IDE%20Options.png"&gt;&lt;img alt="EurekaLog IDE Options" border="0" height="477" src="http://lh6.ggpht.com/_9sWBW4MIeFk/S7B9-wr2-EI/AAAAAAAAAnA/I78c0jOH_xk/EurekaLog%20IDE%20Options_thumb.png?imgmax=800" style="border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: block; float: none; margin-left: auto; margin-right: auto;" title="EurekaLog IDE Options" width="402" /&gt;&lt;/a&gt;&lt;br /&gt; 
"IDE Integration" check-box enables exception hooking inside IDE. &lt;a href="http://stackoverflow.com/questions/2197351/external-exception-eefface-in-delphi" title="External Exception EEFFACE in Delphi"&gt;Here is an example of IDE problem&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Why I'm telling this stuff here? Well, apparently, not all people realize, that EurekaLog hooks IDE too. Sometimes they confuse errors with their applications and errors with IDE. If you're in doubt - turn off this option.&lt;br /&gt;
&lt;br /&gt;
Okay, let's get back to our apps. An report about internal problem is just one case of how memory corruption can manifest itself. Other (the harder ones) cases include application's crash or hang. You will not get any message or report in those cases.&lt;br /&gt;
&lt;br /&gt;
&lt;h1&gt;How to diagnose and fix memory problem&lt;/h1&gt;
If you have memory corruption issue and you gor a report for it - this report will be a simple indication that you have a problem. You &lt;strong&gt;won't&lt;/strong&gt; be able to fix the problem by using this report. Why? Because any such report is a note that the problem &lt;strong&gt;had&lt;/strong&gt; occurred &lt;em&gt;somewhere&lt;/em&gt; and &lt;em&gt;some time ago&lt;/em&gt;. It's somehow similar to memory leaks - and we've already discussed it earlier. The problem is that nobody can scan each CPU instruction and ask: "is this command going to corrupt my memory?" That's why all checks are performed from time to time at certain checkpoints. Besides, only special data can be validated automatically. For example, if we take mem-leaks case - the checkpoints are calls of memory manager's routines and verified data are internal structures and freed memory. But even in that simplest case memory manager does not scan the entire memory pool on each request, limiting check to one memory block in question only. This is a usual trade-off between speed and functionality.&lt;br /&gt;
&lt;br /&gt;
Okay, so, having a report, you will know that there is a problem. But you don't know where is it. You have a chance to locate it in the case of memory leaks, but not in the case of memory corruption. That's because you have some references to code for leaks, but references to code for mem corruptions are off-topic. The real culprit-code can sit a million instructions away in space and time from the code, which crashed because of it, and there is no any references to it. That's why the very first thing, that you should try to do (wherever you have a report or just crash/hang) is to try to &lt;strong&gt;reproduce&lt;/strong&gt; the problem. Sometimes you can do it easily; sometimes it is possible, but hard to do; and often it is just not possible at all.&lt;br /&gt;
&lt;br /&gt;
If you've managed to reproduce the problem - then it is a very simple case. Just debug your application as much as you want. I suspect that the most useful tools here will be memory breakpoints. General strategy is simple: you need to find a moment, when memory is committed, but is not corrupted yet. You place a break-point on the memory (yes, Delphi's debugger can do it; I'll not discuss it here - please, refer to other resources or Delphi's help) and you just run your application. As soon as this break-point fire - you'll find the culprit for memory corruption. Make yourself at home and take your time: analyze the call stack, variables, etc, etc - the situation is under your control.&lt;br /&gt;
&lt;br /&gt;
So, to put it short: the main question here is to locate the problem (assuming you can reproduce it at all). I'll discuss the different methods below, which you can use to locate the problem. Some of them you can use always - both in debug and release version. Some of them are only applicable to debug version.&lt;br /&gt;
&lt;br /&gt;
If you aren't able to solve the problem (either you can't reproduce it or you can reproduce, but can't locate it) – then the only options is to use passive methods. I.e. things, which aren't directed to your &lt;strong&gt;particular&lt;/strong&gt; issue, but rather helps you to &lt;strong&gt;improve&lt;/strong&gt; your code - that way after improvements you'll be able to diagnose the problem or it may be that the problem will go away without doing anything specific. For example, if your code is chaotic mix of totally unrelated routines calls without slightest sign of logic (okay, I'm just joking - I do not think that you're &lt;strong&gt;that&lt;/strong&gt; bad :-D ) - you can spend half a year looking for the reason (and still not solve it). Or you can spend few months to refactor your code, to improve it - and then hunt down and fix not only this problem, but other issues too, which you've spotted because your code becomes much clearer.&lt;br /&gt;
&lt;br /&gt;
I also think that we may publish in our blog examples of debugging particular problems. For example, I want to publish a demo how to debug a hang in your application. But this is for the next time. Just be sure to scan and read us periodically ;)&lt;br /&gt;
&lt;br /&gt;
&lt;h1&gt;Problem's locating (active methods)&lt;/h1&gt;
First at all, you should analyze, what can be your problem. There are two main cases here: dynamic memory (heap) or the stack. Depending on the answer you may use methods for the heap or for the stack. For example, using debugging memory manager can help you with the memory corruptions in the heap, but it can do nothing about stack corruptions. If you aren't sure about it - just use all methods ;)&lt;br /&gt;
&lt;br /&gt;
1. &lt;strong&gt;Using debugging memory manager&lt;/strong&gt; (heap). Debugging memory manager is any memory manager, which provides additional features for debugging memory problems. We meet some examples (like EurekaLog or FastMM) in articles about memory leaks. That's because searching for memory leaks and searching for memory corruption bugs use the very similar approach. EurekaLog's case: additional checks are enabled with "Catch leaks exceptions" option. FastMM's case: see "&lt;code&gt;CheckHeapForCorruption&lt;/code&gt;" and "&lt;code&gt;CatchUseOfFreedInterfaces&lt;/code&gt;" options (together with "&lt;code&gt;FullDebugMode&lt;/code&gt;"). Other options may affect the results too, but these ones are primary options for memory corruption checks. We've already discussed an installation and use of debugging memory managers in previous articles, so I won't go into details here: it's the same for memory corruption problems as it's for mem-leaks – just don't forget to enable additional options and run your application, until memory manager will catch a problem.&lt;br /&gt;
&lt;br /&gt;
Apart from already discussed memory managers - I want to mention a SafeMM memory manager. This is a debugging memory manager too, but it's a bit different from already discussed ones. You can download it &lt;a href="http://cc.embarcadero.com/item/27241" title="CodeCentral: ID: 27241, SafeMM Debug Memory Manager for Delphi/C++"&gt;here&lt;/a&gt;. And &lt;a href="http://cc.embarcadero.com/javascript/play.html?u=y&amp;amp;w=1024&amp;amp;h=768&amp;amp;s=18.4MB&amp;amp;f=http%3a%2f%2fcc.embarcadero.com%2fdownload.aspx%3fid%3d27285%26file%3dMarkEdington_Debugging.swf&amp;amp;d=http%3a%2f%2fcc.embarcadero.com%2fdownload.aspx%3fid%3d27285" title="CodeCentral: Mark Edington on debugging"&gt;here&lt;/a&gt; is an example of use (a video) – the first part is about profiling and second part (starting from 22-nd minute) is about memory problems.&lt;br /&gt;
&lt;br /&gt;
2. &lt;strong&gt;Enabling debugging options&lt;/strong&gt; (stack and heap). We mentioned this before too. The main option here is "Range check errors", which allows you to catch out of range errors in array-based data structures (note, that &lt;a href="http://qc.embarcadero.com/wc/qcmain.aspx?d=10176" title="QC Report #10176"&gt;this option have a bug&lt;/a&gt; in old Delphi's versions). Besides this option, you may want to disable inlining and optimization (to simplify debugging and to avoid bugs &lt;a href="http://qc.embarcadero.com/wc/qcmain.aspx?d=83354" title="QC Report #83354"&gt;like this&lt;/a&gt;). Unfortunately, Delphi's compiler do not have a more generic option for checking stack's state like others compilers have. I've created &lt;a href="http://qc.embarcadero.com/wc/qcmain.aspx?d=82567" title="QC Report #82567"&gt;a request for it&lt;/a&gt; – feel free to vote for it. If such feature exist - this would &lt;strong&gt;greatly&lt;/strong&gt; simplify hunting for stack corruption problems. Well, without compiler support - we have only manual workarounds.&lt;br /&gt;
&lt;br /&gt;
3. &lt;strong&gt;Forced checkpoints&lt;/strong&gt; (stack and heap). As I've already said, any report about memory problem reports only about moment of detection, not about the problem itself. You must locate the problem. But how can you do it? Obviously, you need to find a point, when problem is not occurred yet (memory is not corrupted); find the point, when memory is corrupted. Therefore, the problem will sit somewhere between those two points. Each of these moments will be a checkpoint. Moving (or creating) checkpoints - you can reduce code's area with problem until you locate it. Sometimes, those checkpoints are created automatically. For example, debugging memory manager validates memory block each time its routine is called for this block. For the stack: it can be routine leave. Since you successfully leave the routine - this means that return address wasn't damaged, so there was no stack corruption (at least some type of it). There may be other examples, but it's not important now. I just want to say that if those checkpoints aren't suffice to locate the problem (or they aren't created at all) - then you need to create them manually.&lt;br /&gt;
&lt;br /&gt;
An very good way for stack would be an option proposed just in previous item. Well, we don't have it, so there are no good checkpoints for stack - you need to do everything by hands: by validating local variables manually from time to time - see the next item.&lt;br /&gt;
&lt;br /&gt;
We have an option to force check manually for the heap. You can call &lt;code&gt;CheckMemoryOverrun&lt;/code&gt; routine for EurekaLog's case and &lt;code&gt;ScanMemoryPoolForCorruptions&lt;/code&gt; routine for FastMM's case. You force memory manager to scan the entire memory pool for corruptions by calling one of these routines (obviously, only consistence of internal info/headers can be validated, not the data inside memory blocks). By putting calls to these functions around the code - you put explicit checkpoints. Start with calling them periodically. Once you found a problem between two calls - move them closer to each other, until you locate the problem. Additionally, FastMM allows you to enable full scanning on each memory operation. To do that - you need to set global variable &lt;code&gt;FullDebugModeScanMemoryPoolBeforeEveryOperation&lt;/code&gt; to True. However, you need to understand, that doing so will bring your application's performance to its knees. Never turn it on for large amount of time. First, try to locate the problem with &lt;code&gt;ScanMemoryPoolForCorruptions&lt;/code&gt;'s calls as much as you can. And only if you aren't able to move further - enable &lt;code&gt;FullDebugModeScanMemoryPoolBeforeEveryOperation&lt;/code&gt;, but only for the code between two calls to &lt;code&gt;ScanMemoryPoolForCorruptions&lt;/code&gt;. Well, probably, in many cases you would like to use SafeMM to track the problem.&lt;br /&gt;
&lt;br /&gt;
4. &lt;strong&gt;Debug checks&lt;/strong&gt; (stack and heap). It's not always possible to use or set checkpoints as discussed in previous item. For example, no one can check consistency of &lt;strong&gt;your&lt;/strong&gt; information, all automated tools can check only their info, not yours. That's why you may need to validate your info manually. Well, it's simple: just place as many checks as you want around your code. Put &lt;code&gt;Assert&lt;/code&gt;'s call everywhere. Check every thing, that you're able to check. Once you found a problem between two &lt;code&gt;Assert&lt;/code&gt;'s call - move them closer to each other, just like in checkpoint's case. As soon as you reduce a gap enough to acquire the address of corrupted memory - you're done. Just run your application until the moment before problem and put a memory-break-point on this address (see also below).&lt;br /&gt;
&lt;br /&gt;
5. &lt;strong&gt;Avoiding local variables&lt;/strong&gt; (stack). Since we don't have much tools for the stack - you can move the problem elsewhere by avoiding local variables: try to use global variables (just for test, of course) or (better yet) put all local variables into record, which you allocate dynamically in the heap. This will move the problem to another area, where we have some handy tools (your favourite debugging memory manager).&lt;br /&gt;
&lt;br /&gt;
6. &lt;strong&gt;Problem with threads&lt;/strong&gt; (heap). Multi-threading usually does not affect stacks, but it can be a reason for many hard-to-detect problems with global or heap's data (well, not multi-threading by itself, but rather synchronization errors). Debugging of multi-threaded application is large and complex thing, so I won't go into details here - see other resources.&lt;br /&gt;
&lt;br /&gt;
7. &lt;strong&gt;Memory breakpoints&lt;/strong&gt; (stack and heap). If you'll found an specific address for memory, which was corrupted, things will become much easier. All you need to do now is to use memory breakpoints. Memory breakpoints is handy ability of Delphi's debugger, which allows you to put break-point on memory, just like you do this for code. A memory break-point triggers, when some code accesses memory. I won't go into details on how to use them - use Delphi's help. Ok, back to our problem. So, you have a memory's address. Run your application until the moment, when this memory will be available (allocated). It should be in the valid state at this moment. Place a memory break-point on it. And run your application. When break-point fires - check the code, which caused it. You'll find the culprit eventually.&lt;br /&gt;
&lt;br /&gt;
So, if you wasn't able to solve your problem with the above methods - then the only thing left is:&lt;br /&gt;
&lt;br /&gt;
&lt;h1&gt;Prevention of problems with memory (passive methods)&lt;/h1&gt;
1. &lt;strong&gt;Avoid low-level code&lt;/strong&gt;. It's simple: scan all your code, looking for calls of low-level routines (which aren't type-safe, therefore have a high chance of corrupting memory). Double-check all usage cases. Replace low-level code with high-level counterpart, if you can do it. It's better to do it slow and safe/correct than do it fast, but incorrect.&lt;br /&gt;
&lt;br /&gt;
2. &lt;strong&gt;Use wrappers&lt;/strong&gt;. I've mentioned this before, when we talked about WinAPI calls and "other resources" in add-on for mem-leaks article. Separate all such code into separate unit/class, which you can validate as single entity. You'll reduce searching area and simplify code by placing suspicious/potential troublesome code in the same place.&lt;br /&gt;
&lt;br /&gt;
3. &lt;strong&gt;Code review by other developer&lt;/strong&gt;. It's well-know fact, that your eyes see only things, which you brains want to see. That's why it's good thing to give your code to colleague - sometimes he/she can spot obvious problem, which you can't solve for few hours/days.&lt;br /&gt;
&lt;br /&gt;
4. Actually, this section is endless. There are many books, which tells you how to write a good quality code. And they do this in more details, than I can do it here. That's why I won't list anything further - just give you some advice: read "smart" books. Consider the text above only as short example. You can improve yourself and your code by reading books and blogs. Many problems will be easier to spot or they can disappear eventually.&lt;br /&gt;
&lt;br /&gt;
To put it short: read, read and read again (including us :) ).&lt;br /&gt;
&lt;br /&gt;
Well, that's it. The end of the series. I hope you'll find it useful.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6789056281440007248-1403245971666436391?l=eurekalog.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=dB4T3fsuRZ0:MnsqFG3yCcg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=dB4T3fsuRZ0:MnsqFG3yCcg:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?i=dB4T3fsuRZ0:MnsqFG3yCcg:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=dB4T3fsuRZ0:MnsqFG3yCcg:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?i=dB4T3fsuRZ0:MnsqFG3yCcg:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=dB4T3fsuRZ0:MnsqFG3yCcg:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?i=dB4T3fsuRZ0:MnsqFG3yCcg:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=dB4T3fsuRZ0:MnsqFG3yCcg:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?i=dB4T3fsuRZ0:MnsqFG3yCcg:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=dB4T3fsuRZ0:MnsqFG3yCcg:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/EurekaLog/~4/dB4T3fsuRZ0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://eurekalog.blogspot.com/feeds/1403245971666436391/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://eurekalog.blogspot.com/2010/03/memory-problems-in-delphi-apps-final_30.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6789056281440007248/posts/default/1403245971666436391?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6789056281440007248/posts/default/1403245971666436391?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/EurekaLog/~3/dB4T3fsuRZ0/memory-problems-in-delphi-apps-final_30.html" title="Memory problems in Delphi apps - final article" /><author><name>Alex</name><uri>http://www.blogger.com/profile/02948908401998035458</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://2.bp.blogspot.com/_wZGXrlUYoJ4/TO-jvUZ7ckI/AAAAAAAAAAM/JLytgq1j4g0/S220/IMG_0774_184x184.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh6.ggpht.com/_9sWBW4MIeFk/S7B99m-3xKI/AAAAAAAAAm4/Urw__lJMvhE/s72-c/InternalError_thumb.png?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://eurekalog.blogspot.com/2010/03/memory-problems-in-delphi-apps-final_30.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkYBSHk4fSp7ImA9Wx9SEkk.&quot;"><id>tag:blogger.com,1999:blog-6789056281440007248.post-7282332057660405837</id><published>2010-03-02T09:00:00.006Z</published><updated>2010-12-01T22:55:59.735Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-12-01T22:55:59.735Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="EL 6.x" /><category scheme="http://www.blogger.com/atom/ns#" term="Releases" /><title>EurekaLog 6.0.23 is out</title><content type="html">We are pleased to announce the availability of the new 6.0.23 version.&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;div style="text-align: center;"&gt;
&lt;a href="http://www.eurekalog.com/" target="_blank" title="EurekaLog Logo"&gt;&lt;img alt="EurekaLog Logo" height="68" src="http://www.eurekalog.com/images/logo.png" width="295" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;blockquote&gt;
EurekaLog is a tool for Delphi and C++Builder that gives your application the power to catch every exception and memory leak, generating a detailed log of the call stack (with unit, procedure and line number), optionally sending you a copy of each log entry via email or the Web via the most used Web Bug-Tracking tools (as Mantis, BugZilla and FogBugz).&lt;/blockquote&gt;
&lt;br /&gt;
EurekaLog represents the most advanced exception and memory leaks logger technology available for Delphi/C++Builder developers.&lt;br /&gt;
&lt;br /&gt;
To learn more about EurekaLog, please visit our website at:&lt;br /&gt;
&lt;a href="http://www.eurekalog.com/" target="_blank" title="http://www.eurekalog.com"&gt;http://www.eurekalog.com&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
To download a demo, please visit:&lt;br /&gt;
&lt;a href="http://www.eurekalog.com/downloads.php" target="_blank" title="http://www.eurekalog.com/downloads.php"&gt;http://www.eurekalog.com/downloads.php&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
If you would like to purchase a new license, please visit:&lt;br /&gt;
&lt;a href="http://www.eurekalog.com/buy.php" target="_blank" title="http://www.eurekalog.com/buy.php"&gt;http://www.eurekalog.com/buy.php&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;&lt;br /&gt;Upgrade policy:&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
If you would like to purchase an upgrade, this is our upgrade discount policy:&lt;br /&gt;
&lt;br /&gt;
1)...upgrade from any 4.x or 5.x to any 6.x - 50% discount;&lt;br /&gt;
2)...upgrade from a 6.x license type to another (ex: from a "Single Professional" to a "Corporate Professional") - the price difference.&lt;br /&gt;
&lt;br /&gt;
NOTE: the upgrade from an old 6.x version to the last released version is full free.&lt;br /&gt;
&lt;br /&gt;
Buy your upgrade or download your full version here:&lt;br /&gt;
&lt;a href="http://www.eurekalog.com/login.php" target="_blank" title="http://www.eurekalog.com/login.php"&gt;http://www.eurekalog.com/login.php&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;&lt;br /&gt;Changes:&lt;/strong&gt;&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;Added support for BugZilla 3.4.4;&lt;/li&gt;
&lt;li&gt;Fixed a memory corruption in TLogFile.LoadFromStream (BDS 2009 and above);&lt;/li&gt;
&lt;li&gt;Fixed a fatal crash in Base64 (usually appears in SMTP sending);&lt;/li&gt;
&lt;li&gt;Fixed of the log validity checks;&lt;/li&gt;
&lt;li&gt;Fixed a garbage instead of very long idents in call stack;&lt;/li&gt;
&lt;li&gt;Fixed a rare ecc32 crash on certain conditions;&lt;/li&gt;
&lt;li&gt;Fixed a possible buffer overflow in PNG encoding routines;&lt;/li&gt;
&lt;li&gt;Fixed a random crash at application's shutdown;&lt;/li&gt;
&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6789056281440007248-7282332057660405837?l=eurekalog.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=qxu4VwuKrvc:heuH9HvLMmc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=qxu4VwuKrvc:heuH9HvLMmc:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?i=qxu4VwuKrvc:heuH9HvLMmc:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=qxu4VwuKrvc:heuH9HvLMmc:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?i=qxu4VwuKrvc:heuH9HvLMmc:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=qxu4VwuKrvc:heuH9HvLMmc:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?i=qxu4VwuKrvc:heuH9HvLMmc:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=qxu4VwuKrvc:heuH9HvLMmc:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?i=qxu4VwuKrvc:heuH9HvLMmc:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=qxu4VwuKrvc:heuH9HvLMmc:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/EurekaLog/~4/qxu4VwuKrvc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://eurekalog.blogspot.com/feeds/7282332057660405837/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://eurekalog.blogspot.com/2010/03/new-eurekalog-6023-is-out.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6789056281440007248/posts/default/7282332057660405837?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6789056281440007248/posts/default/7282332057660405837?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/EurekaLog/~3/qxu4VwuKrvc/new-eurekalog-6023-is-out.html" title="EurekaLog 6.0.23 is out" /><author><name>Александр Алексеев</name><uri>https://profiles.google.com/113168002104297556003</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-aUMttZQBsuI/AAAAAAAAAAI/AAAAAAAAC3Y/QuZ7K9t_WzE/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://eurekalog.blogspot.com/2010/03/new-eurekalog-6023-is-out.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A04GRXY6fyp7ImA9Wx9SEk8.&quot;"><id>tag:blogger.com,1999:blog-6789056281440007248.post-1732436787841529906</id><published>2010-02-16T16:26:00.056Z</published><updated>2010-12-01T18:58:44.817Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-12-01T18:58:44.817Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Delphi" /><category scheme="http://www.blogger.com/atom/ns#" term="other tools" /><category scheme="http://www.blogger.com/atom/ns#" term="how it works" /><category scheme="http://www.blogger.com/atom/ns#" term="how-to" /><category scheme="http://www.blogger.com/atom/ns#" term="memory leaks" /><category scheme="http://www.blogger.com/atom/ns#" term="best practice" /><title>Catching memory leaks, redux</title><content type="html">I tried to discuss things, that I've missed &lt;a href="http://www.blogger.com/2009/05/catching-memory-leaks_26.html" title="Catching memory leaks"&gt;last time&lt;/a&gt;.&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;h1&gt;
Reading bug reports (or: how can I resolve mem-leak?)&lt;/h1&gt;
Well, we &lt;a href="/2009/07/how-to-read-bug-reports_28.html" title="How to read bug-reports"&gt;already talked about this before&lt;/a&gt;. Thought I've already said all things, but I think that it's worth to mention them one more time - more focused on mem-leaks this time. That's because many people seems to miss the whole point of mem-leak reports.&lt;br /&gt;
&lt;br /&gt;
Okay, so the first error of newbies is immediate (without any side-thoughts or doubts) opening the code, on which call stack points to - and just sitting here, starring at the line, trying to figure out, what go wrong with this code. The problem is: &lt;strong&gt;memory leak report does not point to the problem&lt;/strong&gt;.&lt;br /&gt;
&lt;br /&gt;
For example, report about leaking of &lt;code&gt;String&lt;/code&gt; type will (probably) point to some trivial code like this:&lt;br /&gt;
&lt;pre class="brush:delphi"&gt;S := IntToStr(I);&lt;/pre&gt;
And what do you expect to find here? :)&lt;br /&gt;
&lt;br /&gt;
And it is not some kind of tool's limitation - it's just that these tools &lt;em&gt;can not read your mind&lt;/em&gt; (well, not yet, you know? :D ). Let's think for a second: what is a leak? Leak is... well, it is when we allocate something and do not release/free it. So, mem-leak report can (and, actually, will) contain that "something" - a resource; and it contains "allocation" - i.e. call stack to line of code, which allocates resource. But where is our problem? An actual problem is sitting at "release/free" moment! A tool can not know: where did you (your code) planned to release resource? That's why report contain only information about allocation. There is no direct information on the problem in the report.&lt;br /&gt;
&lt;br /&gt;
What does it mean, "the problem is in release"? It means, that either &lt;strong&gt;we lost pointer to resource&lt;/strong&gt; or we do have a pointer, but our &lt;strong&gt;release routine wasn't called&lt;/strong&gt; for some reason. And those are points, which you should look at.&lt;br /&gt;
&lt;br /&gt;
So, what should you do with mem-leak report? Well, you first need to follow call stack and find code. But the next thing is different (comparing to exception bug report): you don't need to analyze &lt;strong&gt;this&lt;/strong&gt; line. You need:
&lt;ol&gt;
&lt;li&gt;Note, what resource was allocated here (object, string, array, memory block, etc...).&lt;/li&gt;
&lt;li&gt;Find, where this resource should be released "by plan" (call do destructor, out of scope, explicit free call, etc...).&lt;/li&gt;
&lt;li&gt;Found reason, why resource wasn't release at founded location.&lt;/li&gt;
&lt;/ol&gt;
As I already said, there can be 2 reasons for item 3: we lost reference or we missed the call.&lt;br /&gt;
&lt;br /&gt;
For some reason, newbies like to post their mem-leak reports on forums, saying: "Help me! I can't understand, what's wrong here!". Hope, now you're seeing, how strange this looks: nobody, except the author of the code, can know that! That's because only author can tell, where did he planned to release resources. This looks especially stunning if there was no code posted, except allocation line (which, as we already figured out, have absolute nothing to do with the leak problem) - I think they suppose, that everybody have some kind of telepathic powers :)&lt;br /&gt;
&lt;br /&gt;
That's why it will be more correct to post at least your code along with the report. Better yet - study situation by yourself before posting (we're discussing it now). Or just ask a different question. For example: ask, what can be possible reasons for leak in this code? There may be few guesses answered - and you can check, if they are valid for your case, thus, solving the leak.&lt;br /&gt;
&lt;br /&gt;
Well, it is (more or less) clear with real pointers: you forgot to call release func, you re-assign pointer without releasing old value, etc, etc. But the leaks with auto-finalized types (strings, interfaces) often stun people: how is it possible at all? Isn't automatic management supposed to solve these kind of problems?&lt;br /&gt;
&lt;br /&gt;
Well, certainly, yes - but this doesn't mean, that you can't mess up here ;)&lt;br /&gt;
&lt;br /&gt;
Here goes few examples (note: all examples below are special crafted; nevertheless, they illustrate real-life problems, which you can encounter in your practice; other note: different Delphi versions can generate different machine code, so you may need to adjust examples a little; examples below use Delphi 14.0.3513.24210).&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Example #1&lt;/strong&gt;: memory corruption.&lt;br /&gt;
You have absolutely no problems with resource management in this example. But you have another problem somewhere else. You overwrite memory (a dreaded buffer overflow error!) - possible, by using low-level routines - thus, erasing pointer to resource, which leads to forgotten resource and, therefore, a leak:
&lt;pre class="brush:delphi"&gt;// Warning: BAD code ahead

{$O-} // disable optimization to force compiler to accept stupid code 

procedure TForm1.FormCreate(Sender: TObject);

  procedure Test;
  const
    ArrLen = 5;
  var
    A: array[1..ArrLen - 1] of Integer;
    S: String;
  begin
    // Some actions here
    S := IntToStr(5); // &amp;lt;- mem-leak here!
    // Some actions here
    FillChar(A, ArrLen * SizeOf(Integer), 0);
    // Some actions here
  end; 

begin
  Test;
end; 

initialization
  ReportMemoryLeaksOnShutdown := True;
end.&lt;/pre&gt;
Code in this example will produce a memory leak. Call stack will point to marked line, which (obviously) does not have any problem. Even more: all work with &lt;code&gt;S&lt;/code&gt; does not have any problem either! The real reason lies within work with &lt;code&gt;A&lt;/code&gt; array: a &lt;code&gt;FillChar&lt;/code&gt; routine clears one element more, than array contains (quite a real problem, BTW - here it happened due to unusual array's range). Because, there is a &lt;code&gt;S&lt;/code&gt; variable right after array - &lt;code&gt;FillChar&lt;/code&gt; will clear it. Ooops! We just lost our pointer to string!&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Example #2&lt;/strong&gt;: stack corruption.&lt;br /&gt;
Well, strictly saying, it is memory corruption too. But first example can occur with any memory - not necessary the stack. This example is specific for stack only:
&lt;pre class="brush:delphi"&gt;// Warning: BAD code ahead

{$O-} // disable optimization 

procedure SomeProc(I1: Pointer; I2: Integer); stdcall;
begin
  // Some actions here
end; 

procedure TForm1.FormCreate(Sender: TObject);

  procedure Test;
  var
    P: procedure(I: Pointer); stdcall;
    D: Pointer;
    S: Pointer;
  begin
    P := @SomeProc;
    D := nil;
    // Some actions here
    GetMem(S, 512); // &amp;lt;- mem-leak here!
    P(S);
    SomeProc(nil, 0);
    FreeMem(S);
    // Some actions here
  end; 

begin
  Test;
end; 

initialization
  ReportMemoryLeaksOnShutdown := True;
end.&lt;/pre&gt;
The problem in this example is mismatch of prototypes (declarations) of &lt;code&gt;P&lt;/code&gt; and &lt;code&gt;SomeProc&lt;/code&gt;. So, calling &lt;code&gt;P&lt;/code&gt; (actually - &lt;code&gt;SomeProc&lt;/code&gt;) will pop one more item from stack, resulting in "shifted" stack data. So, any further work (call of &lt;code&gt;SomeProc&lt;/code&gt; right after &lt;code&gt;P&lt;/code&gt;'s call) will damage (in our example - erase) &lt;code&gt;S&lt;/code&gt; pointer. How can application survive a stack corruption, you say? Well, &lt;a href="http://blogs.msdn.com/oldnewthing/archive/2004/01/16/59415.aspx" target="_blank" title="How can a program survive a corrupted stack?"&gt;that happens&lt;/a&gt;. So, we lose the pointer in this example too.&lt;br /&gt;
&lt;br /&gt;
How to fight with such problems - in the next time.&lt;br /&gt;
&lt;br /&gt;
&lt;h1&gt;Leak of other resources' types&lt;/h1&gt;
You can catch &lt;strong&gt;memory&lt;/strong&gt; leaks and it is memory, that &lt;strong&gt;was allocated through Delphi's memory manager&lt;/strong&gt;. I mean, that you can do this by using methods and tools, explained in &lt;a href="/2009/05/catching-memory-leaks_26.html" target="_self" title="Catching memory leaks"&gt;previous article&lt;/a&gt;. You can't monitor any other types of resources by using this approach (replacing/using Delphi's memory manager). Sometimes, people forgot that their tool is not "all-mighty-seeing-eye", and when their apps start growing, but tool doesn't report anything - they just don't know what to think.&lt;br /&gt;
&lt;br /&gt;
For example, GDI resources - they are allocated and deleted by using corresponding WinAPI calls, which (obviously) have nothing to do with Delphi's memory manager - therefore, they aren't counted in your logic of memory leaks. It's worth to note, that often all work with low-level resource is wrapped into class. For example, Delphi applications usually uses &lt;code&gt;TBitmap&lt;/code&gt; class to manage &lt;code&gt;HBITMAP&lt;/code&gt; objects. &lt;code&gt;TBitmap&lt;/code&gt; is a Delphi's wrapper for system resource &lt;code&gt;HBITMAP&lt;/code&gt;. You have one-to-one correspondence in that case (between &lt;code&gt;HBITMAP&lt;/code&gt;'s handle and its class wrapper - &lt;code&gt;TBitmap&lt;/code&gt;). This means, that leaking one kind of resource will automatically mean leak of other resource's type and visa verse. In that case - you can catch resource leak by catching leak of corresponding memory. Well, it is not direct catch, but still a very good choice. Sometimes, there are exceptions though. In the example with &lt;code&gt;TBitmap&lt;/code&gt;: it have &lt;code&gt;ReleaseHandle&lt;/code&gt; method, which allows you to "release" handle &lt;code&gt;HBITMAP&lt;/code&gt;, dis-assigning it from wrapper object - thus, breaking the one-to-one correspondence.&lt;br /&gt;
&lt;br /&gt;
Second example: not resources, but memory. But this time - memory, allocated through different allocator, than Delphi's memory manager. This usually includes memory allocations for WinAPI or 3rd party DLL calls. For example, if you change String type to &lt;code&gt;WideString&lt;/code&gt; in the example #1 above - there will be no leak reported. Why? Well, the leak is still here, but it is hidden now: we have leak of different kind. &lt;code&gt;WideString&lt;/code&gt; is wrapper for &lt;code&gt;BSTR&lt;/code&gt; system type, which have a certain requirement: all memory requests must be completed by specific system memory manager. This means that Delphi's memory manager will be not called - and so we have no chances to find a leak.&lt;br /&gt;
&lt;br /&gt;
Note, that you &lt;em&gt;can&lt;/em&gt; analyze these operations, but this is a more complex task, than catching memory leaks in Delphi's memory manager. That's because there is no one central management here: just a bunch of different functions (besides, there is no official way to add your code to these routines - only by using hacking hooks). I have already mentioned AQ tools as example of tools, which can analyze these situations. But you can use them at testing/developer stage on developer machine only (like FastMM), you can't deploy them to use at client machines (like EurekaLog).&lt;br /&gt;
&lt;br /&gt;
In fact, these examples shows importance of class wrappers. Don't use low-level functions directly all over your code - just write a class wrapper. You can test it and then use in your code. You can significantly simplify code (and, therefore, searching for a leak) by gathering all related code in one place: inside class wrapper.&lt;br /&gt;
&lt;br /&gt;
&lt;h1&gt;How can I find mem-leak without leaving application?&lt;/h1&gt;
Any mem-leak report can only be created at application's shutdown - you can't create it "on demand". This is not a limitation of some method or tool - just common sense.&lt;br /&gt;
&lt;br /&gt;
What is a leak? Leak is when you allocate resource (memory) and don't release it. How can you find it? You need to find all un-released resources, of course. And how can you know, if this particular resource was/will be un-released? All resources, which exists at application's exit, are (definitely) un-released. If they were released - then they didn't be here in the first place.&lt;br /&gt;
&lt;br /&gt;
But how can you do the same logic while program still running? You still need to know: will/was this resource be released or not. How can you know that? You can't. There is no way you may know how many references are there on this resource, and (even if they are) will there be a release call for any reference or not.&lt;br /&gt;
&lt;br /&gt;
Simple example:
&lt;pre class="brush:delphi"&gt;function GetWorkFilePath: String;
begin
  // a lot of action
end;&lt;/pre&gt;
You want to know: does &lt;code&gt;GetWorkFilePath&lt;/code&gt; have a leak? So, you write something like this:
&lt;pre class="brush:delphi"&gt;// Warning: BAD code ahead

function GetWorkFilePath: String;
begin
  MemState := RememberAllAllocatedMemory;
  try
    // a lot of action
  finally
    CreateMemLeakReport(MemState);
  end;
end;&lt;/pre&gt;
Here: &lt;code&gt;RememberAllAllocatedMemory&lt;/code&gt; routine makes a snapshot of all memory allocations, and &lt;code&gt;CreateMemLeakReport&lt;/code&gt; routine compares current snapshot with saved (passed as argument) one. &lt;code&gt;CreateMemLeakReport&lt;/code&gt; creates a mem-leak report for each mis-match in these two snapshots.&lt;br /&gt;
&lt;br /&gt;
Your idea is: I have a solid block of code; all memory should be released, right? So "memory before" and "memory after" should be the same - so any difference will indicate a leak.&lt;br /&gt;
&lt;br /&gt;
Unfortunately, this is not that simple.&lt;br /&gt;
&lt;br /&gt;
In the example above: &lt;code&gt;GetWorkFilePath&lt;/code&gt; routine allocates and return a string. This string will be a leak (judging by your logic) - because it is still here, after function's return. But this happens not because string is a leak, but because function pass string's ownership to caller, making him responsible for string's deletion.&lt;br /&gt;
&lt;br /&gt;
Even more: strings (and not only strings) have a reference counter. Which means, that you can't apply any logic, which is based on memory manager's calls match. That's because most operations with these kind of resources will not call memory manager at all, cause all work will just inc/dec reference counter! The example above &lt;em&gt;could&lt;/em&gt; allocate and &lt;em&gt;could not&lt;/em&gt;allocate memory for the result. The last case holds when routine just return already allocated string (some global variable, for example) or even const.&lt;br /&gt;
&lt;br /&gt;
&lt;h1&gt;Searching for hidden leaks&lt;/h1&gt;
As a matter of fact, when somebody asks question, like in previous point - he didn't want an answer for it. What he's &lt;b&gt;really&lt;/b&gt; asking is: how can he find &lt;em&gt;hidden mem-leaks&lt;/em&gt;.&lt;br /&gt;
&lt;br /&gt;
What is a hidden mem-leak? Take this example: your code creates many objects during your application's run. You want trade memory for speed, so you decided to re-use created objects, putting them to some kind of cache: &lt;code&gt;TObjectList&lt;/code&gt; with ownership for inserted objects. When you need the same object again - you don't recreate it, but just picks from this cache.&lt;br /&gt;
&lt;br /&gt;
And suppose that your code have a bug: one specific kind of object is never deleted from the cache. I.e. your application is growing and growing as the time passes - those are usual "visual signs" of memory leak. In normal conditions this grow is restricted by maximum size of a cache. But since some of your objects are never deleted from the cache - cache grow is unlimited. However: this is not a strict mem-leak. That's because you didn't lose reference to these "lost" objects: they are still here, in the cache. And when application shutdown - cache will be deleted and, thus, all objects in cache (including those forgotten objects) will be deleted too. Strictly saying: you have no mem-leak.&lt;br /&gt;
&lt;br /&gt;
Here is what I mean by "hidden mem-leak". And people ask different questions, trying to find these leaks.&lt;br /&gt;
&lt;br /&gt;
In fact, you don't need some "mem-leak of demand" here. There is one trick for this: run your application and let it work for few hours. Let him eat as much memory as it wants to. Now: pick any random address in your process. What will you see here? A hidden-leak.&lt;br /&gt;
&lt;br /&gt;
Why is that so? Suppose that real working data for your app costs 50 Mb of memory. And suppose that your process eats 60 Mb of memory. Among these 60 Mb: 50 Mb are real working data and 10 Mb - "leaked" objects in your cache. Now, let your process eats 2 Gb of memory. Among these 2 Gb: 50 Мб — are still your real data (okay, may be 70 Mb, but this doesn't matter). All other space (2 Gb - 50 Mb) is for your forgotten objects. So, if you pick any random address - you have a (2048 — 50) / 2048 = 98% chance, that you hit you forgotten object. All you need to do is get its call stack (you run your app in debug mode, right?) and proceed as with usual mem-leak. The more memory process eats - the more garbage be there, and, therefore, the higher chances will be. Even 50% chance is not bad (garbage amount is the same as actual data: 50 + 50 = 100 Mb) - you only need to check few locations, not one.&lt;br /&gt;
&lt;br /&gt;
For these tasks you can use FastMM and its &lt;code&gt;LogAllocatedBlocksToFile&lt;/code&gt; routine. May be you will also find useful other routines (like &lt;code&gt;FastGetHeapStatus&lt;/code&gt;, &lt;code&gt;GetMemoryManagerState&lt;/code&gt;, &lt;code&gt;GetMemoryManagerUsageSummary&lt;/code&gt; and &lt;code&gt;GetMemoryMap&lt;/code&gt;) — just walk through interface section of &lt;code&gt;FastMM4.pas&lt;/code&gt; unit. And if you didn't find suitable routine - there always is an option to write a simple stub memory manager for your case.&lt;br /&gt;
&lt;br /&gt;
&lt;h1&gt;Why mem-leaks are bad and do I always need to release all memory?&lt;/h1&gt;
Generally speaking, often mem-leak does not mean any visible problem to a user: application still works. Mem-leaks? So what? Program still do all tasks, that I need from it. This is especially true for client applications: cause they work for limited amount of time. So mem-leak is not scary - since all memory will be reclaimed at application's exit (refer to &lt;a href="http://www.wintellect.com/cs/blogs/jeffreyr/default.aspx" target="_blank" title="Jeffrey Richter's blog"&gt;Jeffrey Richter&lt;/a&gt;'s book on native code for more info) and so all leaks will be removed too. No, I don't mean that you don't need to fight mem-leaks here: mem-leak is &lt;strong&gt;always bad&lt;/strong&gt;. It is just that mem-leaks aren't that fatal. Of course, &lt;a href="http://blogs.msdn.com/oldnewthing/archive/2004/03/17/91178.aspx" target="_blank" title="On a server, paging = death"&gt;this is not applicable for server applications&lt;/a&gt;. Server applications work for long period of time, so even minor leak will be deadly.&lt;br /&gt;
&lt;br /&gt;
Some other question, which is close related to above, is: "if all memory is reclaimed upon app's shutdown - can I skip cleanup for global variables? They still will be deleted by automatic cleanup from OS!"&lt;br /&gt;
&lt;br /&gt;
Well, the formal answer is: "you can do it". This is correct and you really can do it. But "can" does not mean "should". Obviously, there will be no technical problems with that approach. So, why is this bad?&lt;br /&gt;
&lt;br /&gt;
Because you can't find a real mem-leaks, if you do like this. If you don't pedantically clean all of your resources - you will get a bunch of mem-leak reports. Well, leaks "by design": technically it's a leak (since resource wasn't released), but it is not a logical leak. Since you know, that those aren't reports about real mem-leaks - you will ignore them. And the problem is that if there will be a report about real leak - you may just miss it.&lt;br /&gt;
&lt;br /&gt;
That's why it is a common "good rule" to always clean your resources. Unfortunately, there &lt;em&gt;can&lt;/em&gt; be cases, when you can't do that. Those are very rare cases, but it can happen. But general rule is: &lt;strong&gt;always&lt;/strong&gt; clean your resources, if you can do it. Don't rely on system's cleanup to throw out garbage for you. This will greatly simplify your life in the future.&lt;br /&gt;
&lt;br /&gt;
&lt;h1&gt;Delphi's bugs&lt;/h1&gt;
Well, I guess we can't ignore them :)&lt;br /&gt;
&lt;br /&gt;
Before starting doing anything - make sure, that the problem really exists: run your application in wild run without debugger. This will eliminate any possible false mem-leaks &lt;a href="http://qc.embarcadero.com/wc/qcmain.aspx?d=73762" title="QC Report #73762"&gt;like this&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Aside from IDE's bugs, there can be bugs in RTL/VCL too: &lt;a href="http://qc.embarcadero.com/wc/qcmain.aspx?d=36652" title="QC Report #36652"&gt;example&lt;/a&gt;. It can be direct bugs (and there is change for their fix in next Delphi version - &lt;a href="http://qc.embarcadero.com/wc/qcmain.aspx?d=23063" title="QC Report #23063"&gt;example&lt;/a&gt;), or things that just can't be fixed. Anyway, both cases introduce a mem-leaks in your application and your code has nothing to do with it.&lt;br /&gt;
&lt;br /&gt;
So what can you do here? Putting patching apart - the only thing you can do is to ignore them (since you can't fix them). You should use capabilities of your tool: see if it have some routine like &lt;code&gt;RegisterExpectedMemoryLeak&lt;/code&gt; - you can call this routine at application's start and pass a pointer. When tool will build a mem-leak report it will ignore any leak, that match one of such "registered" pointers. Yes, this is a workaround. You don't fix a problem - you just hide it, so you can concentrate on problems, which you &lt;strong&gt;can&lt;/strong&gt; fix. The main danger here is overuse of such routines: do &lt;strong&gt;NOT&lt;/strong&gt; add all mem-leaks as "registered" - don't forget that this will not fix the problem!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6789056281440007248-1732436787841529906?l=eurekalog.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=gxWeFikLjOQ:UvfzQpkme4k:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=gxWeFikLjOQ:UvfzQpkme4k:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?i=gxWeFikLjOQ:UvfzQpkme4k:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=gxWeFikLjOQ:UvfzQpkme4k:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?i=gxWeFikLjOQ:UvfzQpkme4k:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=gxWeFikLjOQ:UvfzQpkme4k:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?i=gxWeFikLjOQ:UvfzQpkme4k:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=gxWeFikLjOQ:UvfzQpkme4k:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?i=gxWeFikLjOQ:UvfzQpkme4k:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=gxWeFikLjOQ:UvfzQpkme4k:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/EurekaLog/~4/gxWeFikLjOQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://eurekalog.blogspot.com/feeds/1732436787841529906/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://eurekalog.blogspot.com/2010/02/catching-memory-leaks-redux_16.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6789056281440007248/posts/default/1732436787841529906?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6789056281440007248/posts/default/1732436787841529906?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/EurekaLog/~3/gxWeFikLjOQ/catching-memory-leaks-redux_16.html" title="Catching memory leaks, redux" /><author><name>Alex</name><uri>http://www.blogger.com/profile/02948908401998035458</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://2.bp.blogspot.com/_wZGXrlUYoJ4/TO-jvUZ7ckI/AAAAAAAAAAM/JLytgq1j4g0/S220/IMG_0774_184x184.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://eurekalog.blogspot.com/2010/02/catching-memory-leaks-redux_16.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkYDQ3g8eyp7ImA9Wx9SEkk.&quot;"><id>tag:blogger.com,1999:blog-6789056281440007248.post-5123379757780174982</id><published>2009-12-15T14:07:00.003Z</published><updated>2010-12-01T22:56:12.673Z</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-12-01T22:56:12.673Z</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Delphi" /><category scheme="http://www.blogger.com/atom/ns#" term="EL 6.x" /><category scheme="http://www.blogger.com/atom/ns#" term="Releases" /><title>EurekaLog 6.0.22 is out</title><content type="html">We are pleased to announce the availability of the new 6.0.22 version.&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;div style="text-align: center;"&gt;
&lt;a href="http://www.eurekalog.com/" target="_blank" title="EurekaLog Logo"&gt;&lt;img alt="EurekaLog Logo" height="68" src="http://www.eurekalog.com/images/logo.png" width="295" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;blockquote&gt;
EurekaLog is a tool for Delphi and C++Builder that gives your application the power to catch every exception and memory leak, generating a detailed log of the call stack (with unit, procedure and line number), optionally sending you a copy of each log entry via email or the Web via the most used Web Bug-Tracking tools (as Mantis, BugZilla and FogBugz).&lt;/blockquote&gt;
&lt;br /&gt;
EurekaLog represents the most advanced exception and memory leaks logger technology available for Delphi/C++Builder developers.&lt;br /&gt;
&lt;br /&gt;
To learn more about EurekaLog, please visit our website at:&lt;br /&gt;
&lt;a href="http://www.eurekalog.com/" target="_blank" title="http://www.eurekalog.com"&gt;http://www.eurekalog.com&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
To download a demo, please visit:&lt;br /&gt;
&lt;a href="http://www.eurekalog.com/downloads.php" target="_blank" title="http://www.eurekalog.com/downloads.php"&gt;http://www.eurekalog.com/downloads.php&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
If you would like to purchase a new license, please visit:&lt;br /&gt;
&lt;a href="http://www.eurekalog.com/buy.php" target="_blank" title="http://www.eurekalog.com/buy.php"&gt;http://www.eurekalog.com/buy.php&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;&lt;br /&gt;Upgrade policy:&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
If you would like to purchase an upgrade, this is our upgrade discount policy:&lt;br /&gt;
&lt;br /&gt;
1)...upgrade from any 4.x or 5.x to any 6.x - 50% discount;&lt;br /&gt;
2)...upgrade from a 6.x license type to another (ex: from a "Single Professional" to a "Corporate Professional") - the price difference.&lt;br /&gt;
&lt;br /&gt;
NOTE: the upgrade from an old 6.x version to the last released version is full free.&lt;br /&gt;
&lt;br /&gt;
Buy your upgrade or download your full version here:&lt;br /&gt;
&lt;a href="http://www.eurekalog.com/login.php" target="_blank" title="http://www.eurekalog.com/login.php"&gt;http://www.eurekalog.com/login.php&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;&lt;br /&gt;Changes:&lt;/strong&gt;&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;Fixed: call stack tracing improvements;&lt;/li&gt;
&lt;li&gt;Fixed: call stack of main thread is now captured;&lt;/li&gt;
&lt;li&gt;Added: support for Mantis 1.2;&lt;/li&gt;
&lt;li&gt;Added: new command-line compiler "--el_verbose" option to get detailed output;&lt;/li&gt;
&lt;li&gt;Added: new command-line compiler "--el_path" option (to can specify a different EurekaLog's path);&lt;/li&gt;
&lt;li&gt;Added: support for multiply projects compilation (Delphi 2010);&lt;/li&gt;
&lt;li&gt;Added: "CustomSmtpHeloCommand" routine to customize the SMTP HELO command;&lt;/li&gt;
&lt;li&gt;Fixed: Improved the Viewer ability to check the line breaks at the end of the file;&lt;/li&gt;
&lt;li&gt;Fixed: Some Help improvements;&lt;/li&gt;
&lt;li&gt;Fixed: Improved/fixed the Zip routines support (improving the MSVCRT-library checks);&lt;/li&gt;
&lt;li&gt;Fixed: Viewer bug that imported some invalid logs;&lt;/li&gt;
&lt;li&gt;Fixed: Viewer bug that was unable to decode some names in assembler view;&lt;/li&gt;
&lt;li&gt;Fixed: Viewer bug unable to recover after "Wrong file format" error;&lt;/li&gt;
&lt;li&gt;Fixed: Base64 implementation that corrupted memory;&lt;/li&gt;
&lt;li&gt;Fixed: bug that could change working directory when sending email;&lt;/li&gt;
&lt;li&gt;Fixed: bug that showed Cyrillic texts as ???? (from Delphi 2009);&lt;/li&gt;
&lt;li&gt;Fixed: bug that could create malformed bug reports;&lt;/li&gt;
&lt;li&gt;Fixed: bug that caused invalid parsing of map files;&lt;/li&gt;
&lt;li&gt;Fixed: wrong support for C++Builder 2010;&lt;/li&gt;
&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6789056281440007248-5123379757780174982?l=eurekalog.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=AfPynWwsbCc:HBO7qrweLas:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=AfPynWwsbCc:HBO7qrweLas:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?i=AfPynWwsbCc:HBO7qrweLas:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=AfPynWwsbCc:HBO7qrweLas:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?i=AfPynWwsbCc:HBO7qrweLas:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=AfPynWwsbCc:HBO7qrweLas:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?i=AfPynWwsbCc:HBO7qrweLas:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=AfPynWwsbCc:HBO7qrweLas:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?i=AfPynWwsbCc:HBO7qrweLas:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EurekaLog?a=AfPynWwsbCc:HBO7qrweLas:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EurekaLog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/EurekaLog/~4/AfPynWwsbCc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://eurekalog.blogspot.com/feeds/5123379757780174982/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://eurekalog.blogspot.com/2009/12/eurekalog-6022-is-out.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6789056281440007248/posts/default/5123379757780174982?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6789056281440007248/posts/default/5123379757780174982?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/EurekaLog/~3/AfPynWwsbCc/eurekalog-6022-is-out.html" title="EurekaLog 6.0.22 is out" /><author><name>Alex</name><uri>http://www.blogger.com/profile/02948908401998035458</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://2.bp.blogspot.com/_wZGXrlUYoJ4/TO-jvUZ7ckI/AAAAAAAAAAM/JLytgq1j4g0/S220/IMG_0774_184x184.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://eurekalog.blogspot.com/2009/12/eurekalog-6022-is-out.html</feedburner:origLink></entry></feed>

