IDE Profiling

bridged with qnx.development_tools
Robert Muil

IDE Profiling

Post by Robert Muil » Thu Nov 18, 2004 7:18 am

Hello,

Does anyone use the IDE for profiling?

I have found it to be a terribly difficult tool to use.

The whole IDE has some grave flaws, in my opinion.

Robert.

David Gibbs

Re: IDE Profiling

Post by David Gibbs » Thu Nov 18, 2004 2:58 pm

Robert Muil <r.muil@crcmining.com.au> wrote:
Hello,

Does anyone use the IDE for profiling?
I've not hugely used it -- though I have taught the use of it.
I have found it to be a terribly difficult tool to use.
With 6.3.0, there is an off-by-one error for attributing business
to lines of code in the profiling editor, other than that I have
found it reasonable for handling C code. (Not so good on C++,
though.)

Can you describe the difficulties you've run into?

-David
--
David Gibbs
QNX Training Services
dagibbs@qnx.com

Robert Muil

Re: IDE Profiling

Post by Robert Muil » Fri Nov 19, 2004 6:01 am

David,

I am unable to determine how long a program spends, cumulatively, in a
function.

It does not help me to know that 5% of my time was in ldiv() or .plt()
(whatever they are). I want to know that 100% was in main(), then 90% of
that was in do_loop(), etc.

Also, it does not seem to correctly read the symbol table. I have a very
simple program to test, which just loops and does a few printfs. When I
profile it, the calling information only displays call information for the
source I compiled. For example, it does not tell me that do_loop() called
printf().

The sampling information is all over the place. If I reduce the iterations
in do_loop(), the sampling information doesn't even mention printf(). It
never mentions usleep(). With a higher number of iterations (like 99999), I
get a couple of little coloured bars in the text editor, but they don't
correspond to where the program would have run. I only see 1 green and 1
blue bar - no breakdown at all. With 999 iterations, I don't get any
coloured bars.

I have attached a screenshot of the editor after a profile. This is about as
much useful information as I can get out of it.

There is no way to look at the profiling data statistically. No logs, or
textual data, such as the actual numbers that the %Time Usage bars are drawn
from. For CPU usage, all I can get are little coloured bars, and then only
if I am perseverent and lucky.

This is not a tool worthy of the advertising hype that populates the help
documentation. If the documents spent as much time telling me *how* to use
their brilliant, time-saving, modular, single, consistent, integrated
environment as they spent placing adjectives in front of their products, I
may have less to complain about. Unfortunately it seems the deficiencies are
in the product also - not only the documentation. This is especially true of
the profiling and update/installation perspectives.

Just try to save a source file to My Documents quickly - or open an external
c file in an existing editor.

David - I mean no disrespect to you. I am grateful that you have responded
to me, and appreciate that you are regularly very helpful on the newgroups.
My frustration with the IDE, however, needed an out.

Robert.

"David Gibbs" <dagibbs@qnx.com> wrote in message
news:cnidar$30l$1@inn.qnx.com...
Robert Muil <r.muil@crcmining.com.au> wrote:
Hello,

Does anyone use the IDE for profiling?

I've not hugely used it -- though I have taught the use of it.

I have found it to be a terribly difficult tool to use.

With 6.3.0, there is an off-by-one error for attributing business
to lines of code in the profiling editor, other than that I have
found it reasonable for handling C code. (Not so good on C++,
though.)

Can you describe the difficulties you've run into?

-David
--
David Gibbs
QNX Training Services
dagibbs@qnx.com
begin 666 idetest.JPG
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
M@8P3@[2*G.@EK)YX$D\QID6)#*_P#/
M1/\`OH4>='_ST3_OH5E44<P<QJ^='_ST3_OH4>='_P`]$_[Z%95%',',:OG1
M_P#/1/\`OH4>='_ST3_OH5E44<P<QJ^='_ST3_OH4>='_P`]$_[Z%95%',',
M:OG1_P#/1/\`OH4>='_ST3_OH5E44<P<QJ^='_ST3_OH4>='_P`]$_[Z%95%
M',',:OG1_P#/1/\`OH4>='_ST3_OH5E44<P<QJ^='_ST3_OH4>='_P`]$_[Z
M%95%',',:OG1_P#/1/\`OH4>='_ST3_OH5E44<P<QJ^='_ST3_OH4>='_P`]
M$_[Z%95%',',:OG1_P#/1/\`OH4>='_ST3_OH5E44<P<PO7WS^.?Y^OOU[Y^
M<Z^^?QS_`#]??KWS\YU]\_CG^?K[]>^?G.OOG\<_S]??KWS\X68]9NO_`/(%
MG^J?^A"M*LW7_P#D"S_5/_0A4K<9=MO^/6'_`'%_E11;?\>L/^XO\J*!D5K_
M`,?%[_UV'_HM*-3_`.05>?\`7!__`$$T6O\`Q\7O_78?^BTHU/\`Y!5Y_P!<
M'_\`030([FBBBM"0HHHH`**** "BBB@`HHHH`*S]=_Y%[4_^O27_`- -:%9^
MN_\`(O:G_P!>DO\`Z : ,K5=#EU_2]0T]+M+:&ZDD@N2T)=FA92K!#N 5\'A
MB& _NFMG[!_TT_\`':+#_EZ_Z^'_`*5<I6!HI_8/^FG_`([1]@_Z:?\`CM7*
M*+(5D4_L'_33_P`=H^P?]-/_`!VKE%%D%D4_L'_33_QVC[!_TT_\=JY119!9
M%/[!_P!-/_':/L'_`$T_\=JY119!9%/[!_TT_P#':/L'_33_`,=JY119!9%/
M[!_TT_\`':/L'_33_P`=JY119!9%/[!_TT_\=H^P?]-/_':N4460613^P?\`
M33_QVC[!_P!-/_':N4460613^P?]-/\`QVC[!_TT_P#':N4460613^P?]-/_
M`!VC[!_TT_\`':N4460613^P?]-/_':/L'_33_QVKE%%D%D4_L'_`$T_\=H^
MP?\`33_QVKE%%D%D4_L'_33_`,=H^P?]-/\`QVKE%%D%D4_L'_33_P`=H^P?
M]-/_`!VKE%%D%D4_L'_33_QVC[!_TT_\=JY119!9%/[!_P!-/_':/L'_`$T_
M\=JY119!9%/[!_TT_P#':/L'_33_`,=JY119!9%/[!_TT_\`':/L'_33_P`=
MJY119!9%/[!_TT_\=H^P?]-/_':N4460613^P?\`33_QVC[!_P!-/_':N446
M0613^P?]-/\`QVC[!_TT_P#':N4460613^P?]-/_`!VC[!_TT_\`':N44606
M13^P?]-/_':/L'_33_QVKE%%D%D4_L'_`$T_\=H^P?\`33_QVKE%%D%D4_L'
M_33_`,=H^P?]-/\`QVKE%%D%D9'7WS^.?Y^OOU[Y^<Z^^?QS_/U]^O?/SG7W
MS^.?Y^OOU[Y^<Z^^?QS_`#]??KWS\Z*,>LW7_P#D"S_5/_0A6E6;K_\`R!9_
MJG_H0J5N,NVW_'K#_N+_`"HHMO\`CUA_W%_E10,BM?\`CXO?^NP_]%I1J?\`
MR"KS_K@__H)HM?\`CXO?^NP_]%I1J?\`R"KS_K@__H)H$=S1116A(4444 %%
M%% !1110`4444 %9^N_\B]J?_7I+_P"@&M"L_7?^1>U/_KTE_P#0#0!)8?\`
M+U_U\/\`TJY5.P_Y>O\`KX?^E7*2`****8!1110`4444`%%%% !1110`4444
M`%%%% !1110`4444`%%%% !1110`4444`%%%% !1110`4444`%%%% !1110`
M4444`%%%% !1110`4444`%%%% !1110`4444`%%%% &1U]\_CG^?K[]>^?G.
MOOG\<_S]??KWS\YU]\_CG^?K[]>^?G.OOG\<_P`_7WZ]\_/(S'K-U_\`Y L_
MU3_T(5I5FZ__`,@6?ZI_Z$*E;C+MM_QZP_[B_P`J*+;_`(]8?]Q?Y44#(K7_
M`(^+W_KL/_1:4:G_`,@J\_ZX/_Z":+7_`(^+W_KL/_1:4:G_`,@J\_ZX/_Z"
M:!'<T445H2%%%% !1110`4444 %%%% !6?KO_(O:G_UZ2_\`H!K0K/UW_D7M
M3_Z])?\`T T`26'_`"]?]?#_`-*N53L/^7K_`*^'_I5RD@"BBBF 4444`%%%
M% !1110`4444`%%%% !1110`4444`%%%% !1110`4444`%%%% !1110`4444
M`%%%% !1110`4444`%%%% !1110`4444`%%%% !1110`4444`%%%% !1110!
MD=??/XY_GZ^_7OGYSK[Y_'/\_7WZ]\_.=??/XY_GZ^_7OGYSK[Y_'/\`/U]^
MO?/SR,QZS=?_`.0+/]4_]"%:59NO_P#(%G^J?^A"I6XR[;?\>L/^XO\`*BBV
M_P"/6'_<7^5%`R*U_P"/B]_Z[#_T6E&I_P#(*O/^N#_^@FBU_P"/B]_Z[#_T
M6E&I_P#(*O/^N#_^@F@1W-%%%:$A1110`4444 %%%% !1110`5GZ[_R+VI_]
M>DO_`* :T*S]=_Y%[4_^O27_`- -`$EA_P`O7_7P_P#2KE4[#_EZ_P"OA_Z5
M<I(`HHHI@%%%% !1110`4444`%%%% !1110`4444`%%%% !1110`4444`%%%
M% !1110`4444`%%%% !1110`4444`%%%% !1110`4444`%%%% !1110`4444
M`%%%% !1110`4444`9'7WS^.?Y^OOU[Y^<Z^^?QS_/U]^O?/SG7WS^.?Y^OO
MU[Y^<Z^^?QS_`#]??KWS\\C,>LW7_P#D"S_5/_0A6E6;K_\`R!9_JG_H0J5N
M,NVW_'K#_N+_`"HHMO\`CUA_W%_E10,BM?\`CXO?^NP_]%I1J?\`R"KS_K@_
M_H)HM?\`CXO?^NP_]%I1J?\`R"KS_K@__H)H$=S1116A(4444 %%%% !1110
M`4444 %9^N_\B]J?_7I+_P"@&M"L_7?^1>U/_KTE_P#0#0!)8?\`+U_U\/\`
MTJY5.P_Y>O\`KX?^E7*2`****8!1110`4444`%%%% !1110`4444`%%%% !1
M110`4444`%%%% !1110`4444`%%%% !1110`4444`%%%% !1110`4444`%%%
M% !1110`4444`%%%% !1110`4444`%%%% &1U]\_CG^?K[]>^?G.OOG\<_S]
M??KWS\YU]\_CG^?K[]>^?G.OOG\<_P`_7WZ]\_/(S'K-U_\`Y L_U3_T(5I5
MFZ__`,@6?ZI_Z$*E;C+MM_QZP_[B_P`J*+;_`(]8?]Q?Y44#(K7_`(^+W_KL
M/_1:4:G_`,@J\_ZX/_Z":+7_`(^+W_KL/_1:4:G_`,@J\_ZX/_Z":!'<T445
MH2%%%% !1110`4444 %%%% !6?KO_(O:G_UZ2_\`H!K0K/UW_D7M3_Z])?\`
MT T`26'_`"]?]?#_`-*N53L/^7K_`*^'_I5RD@"BBBF 4444`%%%% !1110`
M4444`%%%% !1110`4444`%%%% !1110`4444`%%%% !1110`4444`%%%% !1
M110`4444`%%%% !1110`4444`%%%% !1110`4444`%%%% !1110!D=??/XY_
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
&I:*D9__9
`
end

begin 666 idetest.c
M(VEN8VQU9&4@/'-T9&QI8BYH/@T*(VEN8VQU9&4@/'-T9&EO+F@^#0HC:6YC
M;'5D92 \=6YI<W1D+F@^"@T*=F]I9"!D;U]L;V]P("AV;VED*0T*>PT*"75N
M<VEG;F5D(&QO;F<@;&]N9R!I:3L-"@D-"@EF;W(@*&EI(#T@,#L@:6D@/" Y
M.3D[(&EI*RLI('L-"@D)<')I;G1F("@B+B(I.PT*"7T-"GT-"@T*:6YT(&UA
M:6XH:6YT(&%R9V,L(&-H87(@*F%R9W9;72D@>PT*"7!R:6YT9B@B5V5L8V]M
M92!T;R!T:&4@36]M96YT:6-S($E$15QN(BD[#0H)#0H)9&]?;&]O<" H*3L-
M"@D-"@EP<FEN=&8@*")<;B(I.PT*"0D-"@EU<VQE97 @*#$P,# I.PT*"0D-
9"@ER971U<FX@15A)5%]354-#15-3.PT*?0``
`
end

David Gibbs

Re: IDE Profiling

Post by David Gibbs » Fri Nov 19, 2004 3:33 pm

Robert Muil <r.muil@crcmining.com.au> wrote:
David,

I am unable to determine how long a program spends, cumulatively, in a
function.
Total time directly in a function would be given by the total time in
Sampling information view.

Or, do you mean for a function, and all sub-functions, cumulated to that
function?
It does not help me to know that 5% of my time was in ldiv() or .plt()
(whatever they are). I want to know that 100% was in main(), then 90% of
that was in do_loop(), etc.
Sounds like that's what you want. That can't be done. Well, in theory
it can be done, but the data collection to provide that would be enormous.
What the profiler does is collect 2 types of information -- it annotates
any code compiled with profiling to get function call counts (basically
call pairs), and it samples the execution of the program from the timer
interrupt, storing the current IP, and active thread at that point. Then,
the time useage is "estimated" based on the sampling -- but it doesn't
know what the call path to get to the function is. To get the cumulative
sub-function useage your asking for, at every sample point a full stack
backtrace would have to be collected and stored -- the overhead to collect
that information, and store that information, would be quite impressive,
and heavily impact whatever you were trying to profile. Also, the tool
chain (GCC) doesn't supply tools to do that.

Why would full backtrace be neede?
Consider the following:

int func1() { /* use lots of CPU */}
int funca() { func1(); }
int funcb() { func1(); }
int main() { while (1) { funca(); funcb(); } }

Now, is CPU time spent in func1() attributed to funca() or funcb()? Without
a stack backtrace, you can't know.
Also, it does not seem to correctly read the symbol table. I have a very
simple program to test, which just loops and does a few printfs. When I
profile it, the calling information only displays call information for the
source I compiled. For example, it does not tell me that do_loop() called
printf().
Nope, it doesn't. printf() is in our library -- so it's not instrumented.
If I understand it properly, the call information is put in the prefix
of the called function -- so any of your functions that get called should
have call count information -- but if you call functions from our library,
from source files not compiled -p, from your libraries not compiled -p,
etc, you won't get call count information for those.
The sampling information is all over the place. If I reduce the iterations
in do_loop(), the sampling information doesn't even mention printf(). It
never mentions usleep(). With a higher number of iterations (like 99999), I
get a couple of little coloured bars in the text editor, but they don't
correspond to where the program would have run. I only see 1 green and 1
blue bar - no breakdown at all. With 999 iterations, I don't get any
coloured bars.
I ran it, I got coloured bars with 999 iterations. But, I ran it on
a pretty slow CPU target. (A VMWare session, in fact.) I got a little
bit of CPU attributed to the loop in do_loop(), but looking at the
Sampling information, most of the CPU was attributed to some unknown
function -- I'm going to have to check with a developper as to what
is going on for that. I'm pretty sure that would be the printf().
(And, you won't see the time in a function attributed to the function
call line in the editor.)

Your usleep() is 1000 usec, which is 1 ms -- with a sampling rate of
1ms, I wouldn't expect much attributed to usleep(). It might be another
of the "unknown" functions I'm seeing.
I have attached a screenshot of the editor after a profile. This is about as
much useful information as I can get out of it.
I tried to view the screenshot, but got a garbled image. :(
There is no way to look at the profiling data statistically. No logs, or
textual data, such as the actual numbers that the %Time Usage bars are drawn
from. For CPU usage, all I can get are little coloured bars, and then only
if I am perseverent and lucky.
Are you just looking at the editor for the sampling data, or are you
actually using the QNX Application Profiler perspective, which includes
the Sampling Information and Call Information views which both provide
statistics summaries?

When you launched with profiling, did you click the "Switch to this
Tool's Perspective on Launch" choice to open it automatically?
This is not a tool worthy of the advertising hype that populates the help
documentation. If the documents spent as much time telling me *how* to use
their brilliant, time-saving, modular, single, consistent, integrated
environment as they spent placing adjectives in front of their products, I
may have less to complain about. Unfortunately it seems the deficiencies are
in the product also - not only the documentation. This is especially true of
the profiling and update/installation perspectives.
The update/installation perspective is core Eclipse, and should be
documented in the Eclipse docs, through the Help->Help Contents
menu, in particular I think this is talked about in the Workbench
Users Guide -> Tasks -> Updating Features with the update manager.

The IDE docs seem to be task-oriented, rather than reference oriented.
Just try to save a source file to My Documents quickly - or open an external
c file in an existing editor.
That is an Eclipse paradigm, it works within a subset of the directory
structure, the workspace, and expects everything to be there.
(I think this is not uncommon with IDEs -- they import/export stuff,
but only really deal with stuff that is in their more limitted view/working
area.)

I found it frustrating, too, though.

Hope some of this helps.

-David
--
David Gibbs
QNX Training Services
dagibbs@qnx.com

Mario Charest

Re: IDE Profiling

Post by Mario Charest » Sat Nov 20, 2004 1:24 am

"David Gibbs" <dagibbs@qnx.com> wrote in message
news:cnl3nr$5n4$1@inn.qnx.com...
Robert Muil <r.muil@crcmining.com.au> wrote:
David,

I am unable to determine how long a program spends, cumulatively, in a
function.

Total time directly in a function would be given by the total time in
Sampling information view.

Or, do you mean for a function, and all sub-functions, cumulated to that
function?

It does not help me to know that 5% of my time was in ldiv() or .plt()
(whatever they are). I want to know that 100% was in main(), then 90% of
that was in do_loop(), etc.

Sounds like that's what you want. That can't be done. Well, in theory
it can be done, but the data collection to provide that would be enormous.
I always wonder why the profiler (talking about QNX4, I assume this also
apply to QNX6) don't work by having 2 variables for each function:
When prologue is called ClockCycle is stored in the first variable,
then when the epilogue is called, the difference between start and end
is added to the total (2 variable). No need in sample the IP.
I understand this would add more overhead, but the overhead would
be the same for each function, so the % should stay the same.
I understand this could get tricky with recurvise function but I should
be doable no?

Robert Muil

Re: IDE Profiling

Post by Robert Muil » Mon Nov 22, 2004 1:02 am

David,
Sounds like that's what you want. That can't be done. Well, in theory
it can be done, but the data collection to provide that would be enormous.
Microsoft's Visual Studio handles it with apparent ease. GNU's gprof also
provides this information.
Nope, it doesn't. printf() is in our library -- so it's not instrumented.
Surely it can know enough to tell me that it as called another function -
even if that function is not profiled itself. That it cannot suggests a
shortcoming of the method used.
(And, you won't see the time in a function attributed to the function
call line in the editor.)
What do you mean?
I tried to view the screenshot, but got a garbled image. :(
Sorry - wasn't useful anyway.
Are you just looking at the editor for the sampling data, or are you
actually using the QNX Application Profiler perspective, which includes
... views which both provide statistics summaries?
I am using the proper application profiler perspective. The call graph is
quite useless to me in most circumstances - I know which of my functions I
have called, it is the library calls that interest me. The sampling
information is more useful, but does not give me enough information to be
useful. Also, the information in the editor (coloured bars etc) does not
seem to bear any relation to the sampling information. What summaries are
you talking about? Can it tell me what percentage of time (accurate to 1
d.p. - not just estimated from a bar)
The update/installation perspective is core Eclipse, and should be
documented in the Eclipse docs...
...That is an Eclipse paradigm, it works within a subset of the directory
structure...
I know that much of the IDE is Eclipse, and not directly controlled by QNX,
but that is irrelevant to me as a QNX customer. The IDE was sold by QNX, and
is the main (only?) reason to purchase the expensive PE license. Therefore,
it is QNX's responsibility, regardless of whose technology they have
leveraged in the background.

Also, I have read all that documentation, and it is not very helpful.
I found it frustrating, too, though.
Hope some of this helps.
You have helped me. The profiler in MS Visual Studio helped me. gprof helped
me. QNX's profiler has not. It has taken me nearly a week of work.

I can add a huge list of other complaints, at the top of which would be:
+ my workbench layou is "failed to load" almost every time I run the IDE
+ javaw.exe locks on 100% CPU nearly every 2nd time I run the IDE
+ under an nto host, the CVS perspective fails to checkout certain of my
modules with an "internal error". no other information given.

Compared to Visual Studio, the QNX IDE is hopeless.

Is there a complaints newsgroup?

Robert.
-David
--
David Gibbs
QNX Training Services
dagibbs@qnx.com

Robert Muil

Re: IDE Profiling

Post by Robert Muil » Mon Nov 22, 2004 1:48 am

David,

I hope this screenshot is viewable. It should show how complicated a process
it is to profile even a stupidly simple program.

To determine how much time is spent in do_loop (), and where that is spent,
I first must find out what resolve_rels(), lookup(), hash(),
ConnectAttach(), static_strcmp(), __SysCpupageGet(), _dladdr() functions
are. Most are not even mentioned in the documentation (although this is hard
to be certain of because there is no index).

I must then work out where they are being called from.

I must then work out how much time they are using, presumably by guessing
percentage CPU from the %Time Usage bar or and calculating time in functions
as an percentage of the overall program run time (which would need to be
determined, I suppose, with a separate tool).

I hope that I am wrong about this. If so, please tell me how I can use the
information shown in the Profiler perspective to tell how much time has been
used by the do_loop() function, and where that time was spent).

Also note the coloured bars in the c editor. What is this supposed to
suggest, beyond that QNX likes the sound of its own name and has coloured in
the margin to highlight it?

Robert.


"David Gibbs" <dagibbs@qnx.com> wrote in message
news:cnl3nr$5n4$1@inn.qnx.com...
Robert Muil <r.muil@crcmining.com.au> wrote:
David,

I am unable to determine how long a program spends, cumulatively, in a
function.

Total time directly in a function would be given by the total time in
Sampling information view.

Or, do you mean for a function, and all sub-functions, cumulated to that
function?

It does not help me to know that 5% of my time was in ldiv() or .plt()
(whatever they are). I want to know that 100% was in main(), then 90% of
that was in do_loop(), etc.

Sounds like that's what you want. That can't be done. Well, in theory
it can be done, but the data collection to provide that would be enormous.
What the profiler does is collect 2 types of information -- it annotates
any code compiled with profiling to get function call counts (basically
call pairs), and it samples the execution of the program from the timer
interrupt, storing the current IP, and active thread at that point. Then,
the time useage is "estimated" based on the sampling -- but it doesn't
know what the call path to get to the function is. To get the cumulative
sub-function useage your asking for, at every sample point a full stack
backtrace would have to be collected and stored -- the overhead to collect
that information, and store that information, would be quite impressive,
and heavily impact whatever you were trying to profile. Also, the tool
chain (GCC) doesn't supply tools to do that.

Why would full backtrace be neede?
Consider the following:

int func1() { /* use lots of CPU */}
int funca() { func1(); }
int funcb() { func1(); }
int main() { while (1) { funca(); funcb(); } }

Now, is CPU time spent in func1() attributed to funca() or funcb()?
Without
a stack backtrace, you can't know.

Also, it does not seem to correctly read the symbol table. I have a very
simple program to test, which just loops and does a few printfs. When I
profile it, the calling information only displays call information for
the
source I compiled. For example, it does not tell me that do_loop() called
printf().

Nope, it doesn't. printf() is in our library -- so it's not instrumented.
If I understand it properly, the call information is put in the prefix
of the called function -- so any of your functions that get called should
have call count information -- but if you call functions from our library,
from source files not compiled -p, from your libraries not compiled -p,
etc, you won't get call count information for those.

The sampling information is all over the place. If I reduce the
iterations
in do_loop(), the sampling information doesn't even mention printf(). It
never mentions usleep(). With a higher number of iterations (like 99999),
I
get a couple of little coloured bars in the text editor, but they don't
correspond to where the program would have run. I only see 1 green and 1
blue bar - no breakdown at all. With 999 iterations, I don't get any
coloured bars.

I ran it, I got coloured bars with 999 iterations. But, I ran it on
a pretty slow CPU target. (A VMWare session, in fact.) I got a little
bit of CPU attributed to the loop in do_loop(), but looking at the
Sampling information, most of the CPU was attributed to some unknown
function -- I'm going to have to check with a developper as to what
is going on for that. I'm pretty sure that would be the printf().
(And, you won't see the time in a function attributed to the function
call line in the editor.)

Your usleep() is 1000 usec, which is 1 ms -- with a sampling rate of
1ms, I wouldn't expect much attributed to usleep(). It might be another
of the "unknown" functions I'm seeing.

I have attached a screenshot of the editor after a profile. This is about
as
much useful information as I can get out of it.

I tried to view the screenshot, but got a garbled image. :(

There is no way to look at the profiling data statistically. No logs, or
textual data, such as the actual numbers that the %Time Usage bars are
drawn
from. For CPU usage, all I can get are little coloured bars, and then
only
if I am perseverent and lucky.

Are you just looking at the editor for the sampling data, or are you
actually using the QNX Application Profiler perspective, which includes
the Sampling Information and Call Information views which both provide
statistics summaries?

When you launched with profiling, did you click the "Switch to this
Tool's Perspective on Launch" choice to open it automatically?

This is not a tool worthy of the advertising hype that populates the help
documentation. If the documents spent as much time telling me *how* to
use
their brilliant, time-saving, modular, single, consistent, integrated
environment as they spent placing adjectives in front of their products,
I
may have less to complain about. Unfortunately it seems the deficiencies
are
in the product also - not only the documentation. This is especially true
of
the profiling and update/installation perspectives.

The update/installation perspective is core Eclipse, and should be
documented in the Eclipse docs, through the Help->Help Contents
menu, in particular I think this is talked about in the Workbench
Users Guide -> Tasks -> Updating Features with the update manager.

The IDE docs seem to be task-oriented, rather than reference oriented.

Just try to save a source file to My Documents quickly - or open an
external
c file in an existing editor.

That is an Eclipse paradigm, it works within a subset of the directory
structure, the workspace, and expects everything to be there.
(I think this is not uncommon with IDEs -- they import/export stuff,
but only really deal with stuff that is in their more limitted
view/working
area.)

I found it frustrating, too, though.

Hope some of this helps.

-David
--
David Gibbs
QNX Training Services
dagibbs@qnx.com
begin 666 idetest3.jpg
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
MG"FBG"@!U**2E%(!PIU-%.H`<*44@I12`<*<*:*<* '"E%(*44 .%.%-%.%
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
MN)O+%Q!,9'?RVVI.DC!?+"A#A2!L"X//7)H`U=-UFROU_=R^5,',;03?)(K
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
MWV; !V9'`ZT6079UO_",WO\`T$K?_P`!#_\`'*9-X>NH8VDFU:UCC499FM2
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
MDX &?H!76>#O^0!%_P!=9_\`T:]<RMI<6]RANI8I'V.!Y:%0!@>I-=-X._Y
M$7_76?\`]&O3B9LVJ***H12TN&.W6>WMXTCABDVHB `*-JGL!Z^_U["U/-%;
MPO+<2)%$@RSNP55'J2:IQ6ZS3W99Y5_>8^21E_@7T;_#Z=SY[\8M/O1'974,
M<UUIT2R&1"K3".4D%)&7:WRC+#H0#M)#!<4`2^,/B)<V&MO9:*NFM%;O"DLU
MT9&$KR+O$:;!Q\I4[R2/FZ&NT\'Z[%XE\-6&KP)Y:W*$M'G.QU)5US@9PRD9
M[XS7E'@#X>'7;">]UDW^FVS20_9H;?-N9(UC&[*E?EC+$[1]Y?FPPS@>Q6.E
MVMAH\.EV2-!9PPB"-4<AE4#'#9SGWSGO0!4U7Q-H^E7"P7]_!%*9$C92P_=E
MON[_`.Z#D=<5>_M*Q\^6#[;;>=$`TD?FKN0'&"1G(SD?F*XN3P5>VNG1V%F^
MFWEI;7"7< N81#)(ZL24F9%*L#N;#! 0``0Q):L:^^&-S=W>HF0VK)<7$LXF
MDO)WWB2;S#'Y/"(%!*AOFR%!PI/ !Z1_;.E^84_M*RW@*2OGKD;L;>,]\C'K
MD4D.M:=+<+;_`&R".Y9WC6&215D8J[(<*3DC*G\JXO5_`$MU?:K-;&QB2ZGE
MDB!4@HAL([= <#^&1-WL,$<\55TWX=7MM;:OYTUD]U=;/(E^8F,B]N9SR1D9
M6=1QW![<T =QJ/B32-/1GNM0ME5)TMI") ?*D<X`?GY>0>M7%U&R:>6!;RV,
MT2>9)&)5W(N,[B,\#!'/O7F+_#S69-=.HW#V%P\7[P^=>2LM]*)4<%XRA6 $
M*W";\;N^*FF^&UW-J&HS&2!&FDFN([@WD[DF1BWE>3PB*-VW=\V0,[03P =I
MI_BS2+Z6]6.\A6*VO!8B8R*8Y9##'+\K`XZ2`<]P15G6=>L]*FCAF6XFF9=Y
MCMH6E9$Z;V"]%SW-<UIOAK6%L=:AE@T.R;5=0%P\<:M=101"WBB^52L89R8B
M>0`-V?FQ@N;P_J/A6)KSPNJZE+]CCM)H;Z7:Q6-Y71TV+C(,T@,>%!&T*4VX
M8 TT\;Z$]QJT4=TSMIB123LJ$J5D4,I0_P`7#+G'3<,]14UEJ&AZQ>VWDP0S
M74\#7 +P#<JHRH=Q(RIR< 'GY6Q]TUPB_#FZD\/3#2+E8KB:XBDB:\1HV^S&
M"WCECE4#(),.X+TRJ9Z&NU\.:+J&F:G/>7,]M(=01I;Y47 %P"H0Q< A-FX$
M,3RJGJ7+`$<WBK1]+CO'BM+L6< :26YMK-C"Q'7#@88Y&/KQ3YO&NF0Q0%H-
M1-S-/]G6S%HYN VQG&8\9 *HQSTXKE-;\#>(9K6#3=+N[9-.MHGA1I+Z9//0
MJY1)( A3(9ES("2=O0=!9\1>#-5US4;76;^RT:YODFB$FGR7,@M_)CCN57]Y
MY19GW7+,3L P`.Q9@#JK[Q5IUKIVFWBBZNH]1D\JV6U@:5W;8SGY1R,*C9^E
M7K;6M-N(;61+R!?M1*PI(X1G8<%0IYW \$=17-S^'M7M-*\+)IS65Y>:/.99
M%NIGA20&"6/ 94<\>8,<<@=JPK_X;7-QJJWKRPW+7(S<!KN>!+>0S22LR)'_
M`*T'S,;69<!!R=QP`=QX>\2:;KNG)=VES$,D*\32J7C8L5"L`>"2.!5VYU73
MK4H+J_M(2[%%\R95W,."!D\D9'%><V?@+6$CL6==)MYM,!,`AE<B];[3#.#*
M?+'EX\C;D!_]8Q[8;)\0>%]?MX=0!TVRU"]UWS(S'$\CQV)\YW#K(8L9(FP=
MPC'[L<GL`>K37^CRW+K-=:>]Q9@R.'D0O !C+')RO;GZ582]L;H0A+FVF$N'
MC D5M_4@KZ_=8C']T^E>03>#=5U;5VTW[%'#:Z=;3)]O\R6!KYFNK:949@@*
M@B%UW(9,9SZ ]?X(\$?V%K,FHW,5J':T6"-4FEG:%O-E=P)).6!#J,\9P?E
MH UM2\7V.GWSVSP7L["X6T4VT)E,DQC>4HH')VHA)/0=.N:UK?5+::Q^U,6@
M4 ;HYQLD0GHK*>03D8!ZY%<)K7A2^O[AK1=/LKV&VUEM65;Z1HH;A)8)D*[E
M1\,CR=,<A0>,BM.[\-:C>WEK>R6^DVTD$ M_LJ.\B,"I4OO*K\R _)\O0N#C
M>"@!N:;XIT;4+6ZN(;^!([5PD_G.$,1.,;LGC.1@]Z37]>TK3H[$WDEO-)<7
M-O';Q!T+LTLJQJZ@GD ODD=@:X2/X;W\7A^WTX_89OLUS'>;DNI;9KIO)>)H
MW=$+(JE]RD;MVW!"YS5F'P%J-H+6WMH],EMS=V-U)-+/*9+8031R,D>Y7+[@
MA&2Z\L>.U '>Z]JUMH>F-?7HF:(211!88S([/)(L:*%'))9U'XT:?J]O>6C7
M#+-:! 6=+M#"ZJ/XBK<A>#S[5C>+M%U'Q!X/;3[B/3IKTW5O.T3LZ02)%<I+
ML)PS#*)@G!Y/I5"7PSJ%U;Z9FPT6Q_L[+QVL4LDT<WS9$3,40A/XONG#A&P0
MA5P#>TG7=(U+5;RVLY8QJ$('FHP"R%>Q]2/?WJ[)JVG1&X$M_:(;;'GAIE'E
M9X&[GY<^]<OX'\*7?AS4[V:864\=V6=IE8B2,[V(0#;RI!R3D8(Q@]:J?\(G
MJD,,4<=MI%Q]BOGO(GEF=3?!Q,"DW[L[`OG9!&_)0<#.0 =/K?B33=(ALWGN
M(G>[GMX((DD7?)YTJ1*R@GE07!)'8&M*UO+6\,HM;F"<Q-LD$<@;8WH<=#[5
MYK_P@&K1)%#&=,N$FO+2\EGED=7M/*N5F:.$;#O!`*@DI]*U_AQX+F\+B87'
MEEOL\=J)5O)KAI@F?WC"3"QD]=B@X_O&@#N4541410JJ, `8`'I7,Z_XIT/2
MS?)JT4P@BC=YI6M6:)S'&9"@;&&8*K''M69X=^&UAH6LVVI0:E>320$D));V
MBJ<J1R4A5AU[$58\2^&]0UW6$:>+2/L<22JD\BO(\B/$Z&"2+@,A+[B0XSM
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
M:5)WCW!00%!'&?4>]<-\9(I8_ ET7N'D^=1@JHYQUX'L?S^E7_\`A8-A_P!
MS5O^_*?_`!=1S^.]+N(S'/I&IRQGJKV\;#\B]1./-%Q[ETY<DE+L>2^ XC=P
MQ)$Y(3S7(0C[H09_J?J*]KG,^O?#V]CMU#W=S836X7(`,NQD(R>,;AUK&M?%
MV@VG_'KX?O8>"/W=I$O!ZCAJLQ>/=-BC"1:3JB(.BK @`_#?6,*')6G53^)M
M_C=%2J<T(PMLDON5CD+SPCK\EW;&/3+C^TH);EY=3^U1^7+ ^[RX4&_>&$96
M/E%&5/S8^8Q:3X9O-3U;Q(\&D7MA;6IN4LK6XNEW07+6MDT9&R1EY82,"&(&
M3G!R*[?_`(6#8?\`0,U;_ORG_P`71_PL&P_Z!FK?]^4_^+KI,B/2K#6;/4Y;
MZ:QEFA$3F"V:\&4N`OSR-SM E/ `)V_>('F,$RO$.A>(+_Q%?W6GVTZ>=;*#
M+=2Q[8_D4&*V9'W#)W;O,0#))##OL_\`"P;#_H&:M_WY3_XNC_A8-A_T#-6_
M[\I_\70`WPY;:IIEA?)'H<HLKFYD>WL+BZCWVL0MU&QB&=3OF1S@,<"4$]P+
MG@F.\8WEWJ^DWMCJ4RQK))<-`595W;8XA%(^$3<V`V#\Y/))JK_PL&P_Z!FK
M?]^4_P#BZ/\`A8-A_P! S5O^_*?_`!= '945QO\`PL&P_P"@9JW_`'Y3_P"+
MH_X6#8?]`S5O^_*?_%T`=E17&_\`"P;#_H&:M_WY3_XNC_A8-A_T#-6_[\I_
M\70!V5%<;_PL&P_Z!FK?]^4_^+H_X6#8?] S5O\`ORG_`,70!V5%<;_PL&P_
MZ!FK?]^4_P#BZ/\`A8-A_P! S5O^_*?_`!= '945QO\`PL&P_P"@9JW_`'Y3
M_P"+H_X6#8?]`S5O^_*?_%T`=E17&_\`"P;#_H&:M_WY3_XNC_A8-A_T#-6_
M[\I_\70!V5%<;_PL&P_Z!FK?]^4_^+H_X6#8?] S5O\`ORG_`,70!V5%<;_P
ML&P_Z!FK?]^4_P#BZ/\`A8-A_P! S5O^_*?_`!= '945QO\`PL&P_P"@9JW_
M`'Y3_P"+H_X6#8?]`S5O^_*?_%T`=E17&_\`"P;#_H&:M_WY3_XNC_A8-A_T
M#-6_[\I_\70!V5%<;_PL&P_Z!FK?]^4_^+H_X6#8?] S5O\`ORG_`,70!V5%
M<;_PL&P_Z!FK?]^4_P#BZ/\`A8-A_P! S5O^_*?_`!= '945QO\`PL&P_P"@
M9JW_`'Y3_P"+H_X6#8?]`S5O^_*?_%T`=E17&_\`"P;#_H&:M_WY3_XNC_A8
M-A_T#-6_[\I_\70!V5%<;_PL&P_Z!FK?]^4_^+H_X6#8?] S5O\`ORG_`,70
M!V5%<;_PL&P_Z!FK?]^4_P#BZ/\`A8-A_P! S5O^_*?_`!= '945QO\`PL&P
M_P"@9JW_`'Y3_P"+H_X6#8?]`S5O^_*?_%T`=E17&_\`"P;#_H&:M_WY3_XN
MC_A8-A_T#-6_[\I_\70!V5%<;_PL&P_Z!FK?]^4_^+H_X6#8?] S5O\`ORG_
M`,70!V5%<;_PL&P_Z!FK?]^4_P#BZ/\`A8-A_P! S5O^_*?_`!= '945QO\`
MPL&P_P"@9JW_`'Y3_P"+H_X6#8?]`S5O^_*?_%T`=E17&_\`"P;#_H&:M_WY

David Gibbs

Re: IDE Profiling

Post by David Gibbs » Mon Nov 22, 2004 5:41 pm

Mario Charest <nowheretobefound@8thdimension.com> wrote:
"David Gibbs" <dagibbs@qnx.com> wrote in message

Sounds like that's what you want. That can't be done. Well, in theory
it can be done, but the data collection to provide that would be enormous.

I always wonder why the profiler (talking about QNX4, I assume this also
apply to QNX6) don't work by having 2 variables for each function:
When prologue is called ClockCycle is stored in the first variable,
then when the epilogue is called, the difference between start and end
is added to the total (2 variable). No need in sample the IP.
I understand this would add more overhead, but the overhead would
be the same for each function, so the % should stay the same.
I understand this could get tricky with recurvise function but I should
be doable no?
Yeah, in theory, should be doable. I just don't know how much work on the
compiler side it would be. Currently, we don't do anything specific
for QNX for instrumenting the code -- we just use the standard instrumentation
provided by GCC, essentially the same data generation that grpof will
parse for its output.

I'm not sure the tools people want to get into this sort of customisation
of the tool chain -- it would be a massive support effort, as it would
require re-porting these changes into every GCC upgrade/change as I don't
think such a change would be accepted as part of the main GCC stream.
(ClockCycles() is a QNX specific function, and there is no generally
available way of getting 64-bit free-climbing counters on all hardware
platforms.)

This does, though, sound like a cool way to self-instrument your code
in places where you want/need this information.

-David
--
David Gibbs
QNX Training Services
dagibbs@qnx.com

David Gibbs

Re: IDE Profiling

Post by David Gibbs » Mon Nov 22, 2004 6:17 pm

Robert Muil <r.muil@crcmining.com.au> wrote:
David,

Sounds like that's what you want. That can't be done. Well, in theory
it can be done, but the data collection to provide that would be enormous.

Microsoft's Visual Studio handles it with apparent ease. GNU's gprof also
provides this information.
I don't know about Visual Studio. I do know that gprof lies. (Well, it
makes naive assumptions and reports them as fact.)

Consider:

expensive_func( int COUNT )
{
/* do something time consuming COUNT times */
}

funca() { expensive_func( 10 ); }
funcb() { expensive_func( 1000 ); }
int main() {
while(1) {
funca();
funcb();
}
}

If you profile the above using gprof, it will tell you that funca() and
funcb() each used about 50% of the CPU time. In fact, depending on when
you interrupt and grab the info, you may see slightly more time attributed
to funca() than funcb(). Clearly that is not the case.

We parse the same data output -- but we don't make up statistics that
aren't valid.

You can load a gmon.out into the IDE -- copy it to your project, then
right click on it, and choose "Open in QNX Application Profiler".

This won't display the somewhat confusing library information, either,
as the gmon.out data won't cover that code.
Nope, it doesn't. printf() is in our library -- so it's not instrumented.

Surely it can know enough to tell me that it as called another function -
even if that function is not profiled itself. That it cannot suggests a
shortcoming of the method used.
Yes there are inherent short-comings, they come about because we use
the GCC tool chain for code generation, including the generation of
profiling code.
(And, you won't see the time in a function attributed to the function
call line in the editor.)

What do you mean?
I meant, though it was unclear, that if you call printf() inside funca(),
and spend a noticeable amount of time in printf(), it will not be represented
by a coloured bar on the line of funca() where you called printf().
I tried to view the screenshot, but got a garbled image. :(

Sorry - wasn't useful anyway.

Are you just looking at the editor for the sampling data, or are you
actually using the QNX Application Profiler perspective, which includes
... views which both provide statistics summaries?

I am using the proper application profiler perspective. The call graph is
quite useless to me in most circumstances - I know which of my functions I
have called, it is the library calls that interest me. The sampling
information is more useful, but does not give me enough information to be
useful. Also, the information in the editor (coloured bars etc) does not
seem to bear any relation to the sampling information. What summaries are
you talking about? Can it tell me what percentage of time (accurate to 1
d.p. - not just estimated from a bar)
Ok, in the editor:

Green bar at top of function gives time (sampled) in this function relative
to total time (sampled) of execution. Hover-help for the green bar should
give this as a value in (fractional) seconds and as a % to several decimal
places.

Blue and yellow bars on a line of code give the time (sampled) for this line
relative to the total time program ran (yellow bar) and to the time (sampled)
in this function (blue bar). Hover help over the bars should give this
value in (fractional) seconds and as a % to several decimal places.

There are a couple problems, though. The placement of the code information
lines seems to be off by one. (Existing PR.) And, I think you mentioned
you were Neutrino-hosted. There are a bunch of focus and redraw problems
in Neutrino-hosted that make it such that hover-help often doesn't work,
making this data hard to view. (The redraw and focus problems are supposed
to be fixed for service pack 1, I'm not sure about the finding the right
line problem.)
The update/installation perspective is core Eclipse, and should be
documented in the Eclipse docs...
...That is an Eclipse paradigm, it works within a subset of the directory
structure...

I know that much of the IDE is Eclipse, and not directly controlled by QNX,
but that is irrelevant to me as a QNX customer. The IDE was sold by QNX, and
is the main (only?) reason to purchase the expensive PE license. Therefore,
it is QNX's responsibility, regardless of whose technology they have
leveraged in the background.
Yes, and we work to fix bugs in the Eclipse core, and to get features
or extensions we want/need into the core.

I think the editiability of functions outside the workspace is supposed
to be much better with the next generation of the core Eclipse tools.
Also, I have read all that documentation, and it is not very helpful.
And, the update tools is one that is not needed for useage as a QNX
development environment -- unless you're adding someone else's tools
to the IDE. We try to enhance documentation as needed for core pieces
that are used for QNX development, as well as documenting the non-core
pieces that are QNX specific.
I found it frustrating, too, though.
Hope some of this helps.
I can add a huge list of other complaints, at the top of which would be:
+ my workbench layou is "failed to load" almost every time I run the IDE
Does it generate a .log file when it fails? Check in workspace/.metadata
for a file called ".log". Each time the IDE has an error, it is supposed
to generate a log to that file. Posting the .log file with a description
of the error may allow the problem to be resolved.
+ javaw.exe locks on 100% CPU nearly every 2nd time I run the IDE
Can you describe what you do to trigger this fault?
+ under an nto host, the CVS perspective fails to checkout certain of my
modules with an "internal error". no other information given.
Does it generate a ".log" file?
Is there a complaints newsgroup?
I don't think specifically -- or all of them could be so considered.

-David
--
David Gibbs
QNX Training Services
dagibbs@qnx.com

Steve Reid

Re: IDE Profiling

Post by Steve Reid » Mon Nov 22, 2004 6:27 pm

David Gibbs <dagibbs@qnx.com> wrote:
Robert Muil <r.muil@crcmining.com.au> wrote:
There are a couple problems, though. The placement of the code information
lines seems to be off by one. (Existing PR.) And, I think you mentioned
you were Neutrino-hosted. There are a bunch of focus and redraw problems
in Neutrino-hosted that make it such that hover-help often doesn't work,
making this data hard to view. (The redraw and focus problems are supposed
to be fixed for service pack 1, I'm not sure about the finding the right
line problem.)
The problem with line numbers hasn't been fixed yet, but there is a
partial workaround (this is from the SP1 release notes):

Line numbers in the Memory Analysis, Application Profiler, and Code
Coverage tools are incorrect on SH and MIPS targets. On x86, PowerPC and
ARM targets, the line numbers are off by 1 if you use the stabs
debugging format. (Ref# 21198, 21412)

Workaround: For x86, PowerPC and ARM targets, use the DWARF debugging
format, by adding -gdwarf-2 option to the compile flags.

------------------------------------------
Steve Reid stever@qnx.com
TechPubs (Technical Publications)
QNX Software Systems
------------------------------------------

David Gibbs

Re: IDE Profiling

Post by David Gibbs » Mon Nov 22, 2004 8:24 pm

Robert Muil <r.muil@crcmining.com.au> wrote:
David,

I hope this screenshot is viewable. It should show how complicated a process
it is to profile even a stupidly simple program.
This one displayed.

I copied the source, profiled it, and got completely different results,
though. (And, I got the results I expected, too.)
To determine how much time is spent in do_loop (), and where that is spent,
I first must find out what resolve_rels(), lookup(), hash(),
ConnectAttach(), static_strcmp(), __SysCpupageGet(), _dladdr() functions
are. Most are not even mentioned in the documentation (although this is hard
to be certain of because there is no index).
Actually, the documentation does have an index. At the top and bottom
of every page in the library reference there are 4 square boxes, labelled
(left to right): "Previous", "Contents", "Index", "Next".

But, the index may not help, as it will probably not have index entries
for non-exported library functions.

I've been testing against an x86 target, and when I ran it, I got the
most CPU in TimerTimeout_r -- I happen to know that's the kernel call
used to implement the usleep(). But, this tool does supply information
that is hard to decode, when it supplies information about what is
happening in the C library. (Note: I could not get gprof to reveal
any information about time spent in the C library. This would appear
to be extra information beyond what gprof can do that the IDE & qconn
try to collect.)

What target are you testing against?
I must then work out where they are being called from.

I must then work out how much time they are using, presumably by guessing
percentage CPU from the %Time Usage bar or and calculating time in functions
as an percentage of the overall program run time (which would need to be
determined, I suppose, with a separate tool).
Hm... you could sum the "Total Time" for all the functions -- but you are
right, that would be a pain. The "% Total used" should give the information
numerically, as well as giving the green bar. I've issued PR 22667 to
address this shortcoming.
I hope that I am wrong about this. If so, please tell me how I can use the
information shown in the Profiler perspective to tell how much time has been
used by the do_loop() function, and where that time was spent).
I do not think you can get this information. I do not think the data
needed to answer this question is generated. (That is, I don't think
gprof could tell you this either.)
Also note the coloured bars in the c editor. What is this supposed to
suggest, beyond that QNX likes the sound of its own name and has coloured in
the margin to highlight it?
I talked in a previous reply about what the bars are supposed to
represent. I noted there was a known bug with them. (There's actually
at least one other bug with the attribution of time in a library function.)
Steve Reid posted a work-around for the mis-found line problem (for some
targets).

-David
--
David Gibbs
QNX Training Services
dagibbs@qnx.com

Robert Muil

Re: IDE Profiling

Post by Robert Muil » Tue Nov 23, 2004 2:47 am

I don't know about Visual Studio. I do know that gprof lies. (Well, it
makes naive assumptions and reports them as fact.)

Consider:

expensive_func( int COUNT )
{
/* do something time consuming COUNT times */
}

funca() { expensive_func( 10 ); }
funcb() { expensive_func( 1000 ); }
int main() {
while(1) {
funca();
funcb();
}
}
I cannot get stats for this, with gprof. I compile it with 'cc -g -p
main.c', then run it with ./a.out to generate the gmon.out. When I run
gprof, it tells me the call counts, but contains no times at all.
There are a couple problems, though. The placement of the code
information
lines seems to be off by one. (Existing PR.) And, I think you mentioned
you were Neutrino-hosted. There are a bunch of focus and redraw problems
in Neutrino-hosted that make it such that hover-help often doesn't work,
making this data hard to view. (The redraw and focus problems are
supposed
to be fixed for service pack 1, I'm not sure about the finding the right
line problem.)
I have an nto-hosted IDE to test and a windows-based one. I can't use the
nto-based one for any of my proper projects, because it can not checkout the
CVS modules without an "internal error". The testing I have been doing
regarding these postings have been in a windows-based IDE.
Yes, and we work to fix bugs in the Eclipse core, and to get features
or extensions we want/need into the core.
I think the editiability of functions outside the workspace is supposed
to be much better with the next generation of the core Eclipse tools.
That's good to hear. Will this be available for 6.2.1 or just >6.3.0?
Also, I have read all that documentation, and it is not very helpful.

And, the update tools is one that is not needed for useage as a QNX
development environment -- unless you're adding someone else's tools
to the IDE. We try to enhance documentation as needed for core pieces
that are used for QNX development, as well as documenting the non-core
pieces that are QNX specific.
I appreciate that people like yourself do, and QNX's development is
admirable. But please, less marketing hype. Aim the documentation at
technicians and engineers, not other marketing departments.
I can add a huge list of other complaints, at the top of which would be:
+ my workbench layou is "failed to load" almost every time I run the IDE

Does it generate a .log file when it fails? Check in workspace/.metadata
for a file called ".log". Each time the IDE has an error, it is supposed
to generate a log to that file. Posting the .log file with a description
of the error may allow the problem to be resolved.
I have looked through this log and am none the wiser, but I will post it
when the error occurs again (the whole log file is formidably large atm).
+ javaw.exe locks on 100% CPU nearly every 2nd time I run the IDE

Can you describe what you do to trigger this fault?
So far, the only common trigger is running the IDE. It is usually associated
with a debugging or system information session, but it is intermittent.
+ under an nto host, the CVS perspective fails to checkout certain of my
modules with an "internal error". no other information given.
Does it generate a ".log" file?
Answered in new thread.

Robert Muil

Re: IDE Profiling

Post by Robert Muil » Tue Nov 23, 2004 2:57 am

I copied the source, profiled it, and got completely different results,
though. (And, I got the results I expected, too.)
I don't understand that. Are you using 6.2.1 IDE? Why would I get completely
different results?
Actually, the documentation does have an index. At the top and bottom
of every page in the library reference there are 4 square boxes, labelled
(left to right): "Previous", "Contents", "Index", "Next".
Yes, you are right, I had been looking for an overall index in the help
browser. I apologise.
But, the index may not help, as it will probably not have index entries
for non-exported library functions.

I've been testing against an x86 target, and when I ran it, I got the
most CPU in TimerTimeout_r -- I happen to know that's the kernel call
used to implement the usleep(). But, this tool does supply information
that is hard to decode, when it supplies information about what is
happening in the C library. (Note: I could not get gprof to reveal
any information about time spent in the C library. This would appear
to be extra information beyond what gprof can do that the IDE & qconn
try to collect.)
Can you get gprof to give you any time information at all? I cannot.
What target are you testing against?
A standard x86 PC with QNX6.2.1 Momentics PE for now.
Hm... you could sum the "Total Time" for all the functions -- but you are
right, that would be a pain. The "% Total used" should give the
information
numerically, as well as giving the green bar. I've issued PR 22667 to
address this shortcoming.
Thank you.
I hope that I am wrong about this. If so, please tell me how I can use
the
information shown in the Profiler perspective to tell how much time has
been
used by the do_loop() function, and where that time was spent).

I do not think you can get this information. I do not think the data
needed to answer this question is generated. (That is, I don't think
gprof could tell you this either.)
I do not understand how the profiler can be used, therefore, to give useful
information. This seems to me to be so fundamental as to erode the purpose
of the profiler. It is akin to measuring the pressure on soldiers' feet to
determine the movement an army.
Steve Reid posted a work-around for the mis-found line problem (for some
targets).
Noted.
-David
--
David Gibbs
QNX Training Services
dagibbs@qnx.com
Thank you for your attention David.

Robert.

John Garvey

Re: IDE Profiling

Post by John Garvey » Tue Nov 23, 2004 3:01 am

Robert Muil wrote:
I cannot get stats for this, with gprof. I compile it with 'cc -g -p
main.c', then run it with ./a.out to generate the gmon.out. When I run
gprof, it tells me the call counts, but contains no times at all.
What happens if you run the profiled a.out as root? I found that gprof
did not give me times (call counts only) when I was non-root, then
repeating the run after doing a "su" I got non-0 timing figures:

[UID != 0]
Each sample counts as 0.001 seconds.
no time accumulated

% cumulative self self total
time seconds seconds calls Ts/call Ts/call name
0.00 0.00 0.00 2000 0.00 0.00 expensive_func
0.00 0.00 0.00 1000 0.00 0.00 funca
0.00 0.00 0.00 1000 0.00 0.00 funcb
0.00 0.00 0.00 1 0.00 0.00 main

VERSUS:

[UID == 0]
Each sample counts as 0.001 seconds.
% cumulative self self total
time seconds seconds calls ms/call ms/call name
100.00 20.04 20.04 2000 10.02 10.02 expensive_func
0.00 20.04 0.00 1000 0.00 10.02 funca
0.00 20.04 0.00 1000 0.00 10.02 funcb
0.00 20.04 0.00 1 0.00 20043.00 main

Robert Muil

Re: IDE Profiling

Post by Robert Muil » Tue Nov 23, 2004 3:30 am

That does it. Thanks indeed.

I'd had this one solved for me previously and forgot it, embarrassingly
enough.

Robert.

"John Garvey" <jgarvey@qnx.com> wrote in message
news:cnu8ok$3df$1@inn.qnx.com...
Robert Muil wrote:
I cannot get stats for this, with gprof. I compile it with 'cc -g -p
main.c', then run it with ./a.out to generate the gmon.out. When I run
gprof, it tells me the call counts, but contains no times at all.

What happens if you run the profiled a.out as root? I found that gprof
did not give me times (call counts only) when I was non-root, then
repeating the run after doing a "su" I got non-0 timing figures:

[UID != 0]
Each sample counts as 0.001 seconds.
no time accumulated

% cumulative self self total
time seconds seconds calls Ts/call Ts/call name
0.00 0.00 0.00 2000 0.00 0.00 expensive_func
0.00 0.00 0.00 1000 0.00 0.00 funca
0.00 0.00 0.00 1000 0.00 0.00 funcb
0.00 0.00 0.00 1 0.00 0.00 main

VERSUS:

[UID == 0]
Each sample counts as 0.001 seconds.
% cumulative self self total
time seconds seconds calls ms/call ms/call name
100.00 20.04 20.04 2000 10.02 10.02 expensive_func
0.00 20.04 0.00 1000 0.00 10.02 funca
0.00 20.04 0.00 1000 0.00 10.02 funcb
0.00 20.04 0.00 1 0.00 20043.00 main

Post Reply

Return to “qnx.development_tools”