Let's say we must iterate all Persons. Sure, by knowing its storage scheme, we can do it with Order but it's like invoking virtual function by memory offset in c++ world. The only object-oriented (i.e. without knowing too much of object internals) way I know is to use Extent. I wonder why generated class does not provide methods like GetFirst/GetLast/GetNext, this way users of the class could iterate extent in object-oriented way.

"I don't tend to use the call stack view"

I'm not able to comprehend thatsmiley In my world stack view is as natural as.. as... as... I don't know, there is nothing more natural as working stack view in any debugger.

The trick with LOG^%ETN is for a case when you need the stack saved to a diagnostic log. But usual case for stack view is you have your debugger stopped on a breakpoint in some library routine and want to know what path brought you here. What you do? I look at stack view and click it to navigate to a call place.

"I don't tend to use the call stack view"

I'm not able to comprehend thatsmiley In my world stack view is as natural as.. as... as... I don't know, there is nothing more natural as working stack view in any debugger.

The trick with LOG^%ETN is for a case when you need the stack saved to a diagnostic log. But usual case for stack view is you have your debugger stopped on a breakpoint in some library routine and want to know what path brought you here. What you do? I look at stack view and click it to navigate to a call place.

The 'crash' is my post is actually incorrect. Studio never crashes, it always stops responding. So no error codes.

Now it took me about 15 minutes to reproduce the problem. I placed several breakpoints in my code and randomly clicked the stack every time debugger stopped, and at first everything worked OK. But then, without any evident reason, Studio stopped responding. Process info reports this:

Execution Details
Process State:EVTW
Last Global Reference:%apiOLE("debug")
Routine:%Debugger.System.1
Source Location:+415^%Debugger.System.1

 

I refreshed the page several times, the info remains the same

From CacheQuality web site:

Pricing
We have different pricing model accordingly with your needs, starting at a rate of 4.200$

To me this is a way to expensive just to know that method or property doesn't exist. Moreover, I want to know it immediately at project compile time. An external tool could parse the code during the night and tell some complex statistics but simple things must tell compiler

Of course if your debugger is as bad as Cache Studio's than you have to find a way to live without wink

After so many year with Microsoft Visual Studio the debugger is the thing I use every day. Not because my code is so bad that I have to hunt the bugs all the time. I like to step through each line of new code with debugger to ensure that it not only works well but also "smells" well (names are reasonable, log texts are reasonable etc).

In Cache I use debugger to run my unit tests using my very simple unit test framework - if a test fails, you can very quickly step it through without any zen meditations.

Many thanks for the tip about track variables option,  I never knew it. Very useful. After c++ the lack of basic syntax checking drives me mad sometimes.

About (10) in your list. I would say each app must have a diagnostic log with configurable level of details. This is the way to get ideas about events/names/ids involved. Not stone-age temporary traces in the source code.

here is one real example of my self backed location:

<EXCEPTION>
assertion failed: digi.chimport.debugMakeStatus: invalid param: 'acc' stack:
zthrowif+2^digi.core.AssertException.1 +1
zdebugMakeStatus+7^digi.chimport.1 +1
ztestChImport+43^digi.test.main.1 +1
%DispatchClassMethod+8^digi.test.framework.1 +1
zdoall+11^digi.test.main.1 +1
zrun+3^digi.test.main.1 +1
zDebugStub+30^%Debugger.System.1 +2
</EXCEPTION>