Author Topic: Please help to solve the 'Code Profiler' problem on Linux x86_64 system.  (Read 14667 times)

Offline wangdong1226

  • Multiple posting newcomer
  • *
  • Posts: 46
Could anybody be kindly to solve the Code Profiler problem which will cause the whole CodeBlocks crash during using it in C Language ?

But when using it in C++ Language, Code Profiler works well.   Why?  :?




Another topic ( using code profiler in C - crash! (svn 7071) http://forums.codeblocks.org/index.php/topic,14430.msg97128/topicseen.html#msg97128 ) solve the "codesnippets building problem" in Linux X86_64 system.


David.

Offline oBFusCATed

  • Developer
  • Lives here!
  • *****
  • Posts: 13413
    • Travis build status
Does it happen with a "hello world" project or it happens only with complex projects?
(most of the time I ignore long posts)
[strangers don't send me private messages, I'll ignore them; post a topic in the forum, but first read the rules!]

Offline MortenMacFly

  • Administrator
  • Lives here!
  • *****
  • Posts: 9694
Could anybody be kindly to solve the Code Profiler problem which will cause the whole CodeBlocks crash during using it in C Language ?
What is exactly your problem? Profiling works fine for me. Sample project? Step-by-step instructions? Please provide more information.
Compiler logging: Settings->Compiler & Debugger->tab "Other"->Compiler logging="Full command line"
C::B Manual: https://www.codeblocks.org/docs/main_codeblocks_en.html
C::B FAQ: https://wiki.codeblocks.org/index.php?title=FAQ

Offline Jenna

  • Administrator
  • Lives here!
  • *****
  • Posts: 7255
Could anybody be kindly to solve the Code Profiler problem which will cause the whole CodeBlocks crash during using it in C Language ?
What is exactly your problem? Profiling works fine for me. Sample project? Step-by-step instructions? Please provide more information.
I just tested it on linux with a wizard created c-console project and it crashes.
I look into it.

Offline Jenna

  • Administrator
  • Lives here!
  • *****
  • Posts: 7255
The crash happens, because the output is empty (except for the headers) and parsing for Call graph data starts beyond the array boundary.
Should be fixed in svn r7075.

Offline oBFusCATed

  • Developer
  • Lives here!
  • *****
  • Posts: 13413
    • Travis build status
Jens, probably you should add a check at line 108, too...
(most of the time I ignore long posts)
[strangers don't send me private messages, I'll ignore them; post a topic in the forum, but first read the rules!]

Offline Jenna

  • Administrator
  • Lives here!
  • *****
  • Posts: 7255
Jens, probably you should add a check at line 108, too...
I don't think it's needed, because count is initialized with zero and can not be out of boundary here (we check for empty arrays in line 99).

Offline wangdong1226

  • Multiple posting newcomer
  • *
  • Posts: 46
Dear Jens,

Thank you for your effort. CodeBlocks-svn7075 has solved the crash problem when using code profiler in C language.

But, there a little bit strange:
When I using Code Profiler in C language, every time when I tried different .c file, and each time I build it and run it, but I got an empty output all the same.   :shock:

for example:


----------------
Flat profile:

Each sample counts as 0.01 seconds.
 no time accumulated

  %   cumulative   self              self     total           
 time   seconds   seconds    calls  Ts/call  Ts/call  name   

 %         the percentage of the total running time of the
time       program used by this function.

cumulative a running sum of the number of seconds accounted
 seconds   for by this function and those listed above it.

 self      the number of seconds accounted for by this
seconds    function alone.  This is the major sort for this
           listing.

calls      the number of times this function was invoked, if
           this function is profiled, else blank.
 
 self      the average number of milliseconds spent in this
ms/call    function per call, if this function is profiled,
      else blank.

 total     the average number of milliseconds spent in this
ms/call    function and its descendents per call, if this
      function is profiled, else blank.

name       the name of the function.  This is the minor sort
           for this listing. The index shows the location of
      the function in the gprof listing. If the index is
      in parenthesis it shows where it would appear in
      the gprof listing if it were to be printed.
----------------


Am I wrong somewhere?


Best regards.
David.
« Last Edit: April 01, 2011, 05:50:03 pm by wangdong1226 »

Offline Jenna

  • Administrator
  • Lives here!
  • *****
  • Posts: 7255
No, you are not wrong, but that was the cause for the crash.

If you try gprof from console with a simple wizard-create hello world project it is in fact empty:

Code
jens@debian-inspiron:/tmp/testc$ gprof bin/Debug/testc gmon.out 
Flat profile:

Each sample counts as 0.01 seconds.
 no time accumulated

  %   cumulative   self              self     total          
 time   seconds   seconds    calls  Ts/call  Ts/call  name    

 %         the percentage of the total running time of the
time       program used by this function.

cumulative a running sum of the number of seconds accounted
 seconds   for by this function and those listed above it.

 self      the number of seconds accounted for by this
seconds    function alone.  This is the major sort for this
           listing.

calls      the number of times this function was invoked, if
           this function is profiled, else blank.
 
 self      the average number of milliseconds spent in this
ms/call    function per call, if this function is profiled,
  else blank.

 total     the average number of milliseconds spent in this
ms/call    function and its descendents per call, if this
  function is profiled, else blank.

name       the name of the function.  This is the minor sort
           for this listing. The index shows the location of
  the function in the gprof listing. If the index is
  in parenthesis it shows where it would appear in
  the gprof listing if it were to be printed.

But if you add a simple call to a function of your own, you get some output.
Maybe the C-libraries of debian (and ubuntu/mint) are not build with -pg flag set.

By the way: please use code-tags if you paste sources or console output, it's much better readable.
« Last Edit: April 01, 2011, 06:17:57 pm by jens »

Offline oBFusCATed

  • Developer
  • Lives here!
  • *****
  • Posts: 13413
    • Travis build status
wangdong1226:
Keep in mind that gprof works only for CPU intensive profiling and doesn't work with static libraries.
If you have blocking syscalls, sleeps or something like this, gprof won't be usable.
(most of the time I ignore long posts)
[strangers don't send me private messages, I'll ignore them; post a topic in the forum, but first read the rules!]

Offline wangdong1226

  • Multiple posting newcomer
  • *
  • Posts: 46
OK, understand.

Thank you very much for your kindness, Jens and oBFusCATed.   :P

I compared the codeblocks on MinGW & XP and codeblocks on Fedora14 x86_64, the same simple .c file, the code profiler's result is different.

1). codeblocks on MinGW & XP, simple .c file:
Code
#include <stdio.h>
int main()
{
    float f1 = 3.0;
    double d2 = 3.0;
    long l3 = 2000000000;
    long l4 = 1234567890;

    printf("%.1e %.1e %.1ld %.1ld\n", f1, d2, l3, l4);
    printf("%ld %ld\n", l3, l4);
    printf("%e %.1e %ld %ld\n", f1, d2, l3, l4);

    return 0;
}
built and ran, then I got code profiler result as follows:
Code
Flat profile:

Each sample counts as 0.01 seconds.
  %   cumulative   self              self     total          
 time   seconds   seconds    calls  Ts/call  Ts/call  name    
100.00      0.01     0.01                             __mingw_pformat
  0.00      0.01     0.00        3     0.00     0.00  __gcc_deregister_frame

 %         the percentage of the total running time of the
time       program used by this function.

cumulative a running sum of the number of seconds accounted
 seconds   for by this function and those listed above it.

 self      the number of seconds accounted for by this
seconds    function alone.  This is the major sort for this
           listing.

calls      the number of times this function was invoked, if
           this function is profiled, else blank.
 
 self      the average number of milliseconds spent in this
ms/call    function per call, if this function is profiled,
  else blank.

 total     the average number of milliseconds spent in this
ms/call    function and its descendents per call, if this
  function is profiled, else blank.

name       the name of the function.  This is the minor sort
           for this listing. The index shows the location of
  the function in the gprof listing. If the index is
  in parenthesis it shows where it would appear in
  the gprof listing if it were to be printed.

    Call graph (explanation follows)


granularity: each sample hit covers 4 byte(s) for 100.00% of 0.01 seconds

index % time    self  children    called     name
                                                 <spontaneous>
[1]    100.0    0.01    0.00                 __mingw_pformat [1]
-----------------------------------------------
                0.00    0.00       3/3           main [119]
[3]      0.0    0.00    0.00       3         __gcc_deregister_frame [3]
-----------------------------------------------

 This table describes the call tree of the program, and was sorted by
 the total amount of time spent in each function and its children.

 Each entry in this table consists of several lines.  The line with the
 index number at the left hand margin lists the current function.
 The lines above it list the functions that called this function,
 and the lines below it list the functions this one called.
 This line lists:
     index A unique number given to each element of the table.
Index numbers are sorted numerically.
The index number is printed next to every function name so
it is easier to look up where the function in the table.

     % time This is the percentage of the `total' time that was spent
in this function and its children.  Note that due to
different viewpoints, functions excluded by options, etc,
these numbers will NOT add up to 100%.

     self This is the total amount of time spent in this function.

     children This is the total amount of time propagated into this
function by its children.

     called This is the number of times the function was called.
If the function called itself recursively, the number
only includes non-recursive calls, and is followed by
a `+' and the number of recursive calls.

     name The name of the current function.  The index number is
printed after it.  If the function is a member of a
cycle, the cycle number is printed between the
function's name and the index number.


 For the function's parents, the fields have the following meanings:

     self This is the amount of time that was propagated directly
from the function into this parent.

     children This is the amount of time that was propagated from
the function's children into this parent.

     called This is the number of times this parent called the
function `/' the total number of times the function
was called.  Recursive calls to the function are not
included in the number after the `/'.

     name This is the name of the parent.  The parent's index
number is printed after it.  If the parent is a
member of a cycle, the cycle number is printed between
the name and the index number.

 If the parents of the function cannot be determined, the word
 `<spontaneous>' is printed in the `name' field, and all the other
 fields are blank.

 For the function's children, the fields have the following meanings:

     self This is the amount of time that was propagated directly
from the child into the function.

     children This is the amount of time that was propagated from the
child's children to the function.

     called This is the number of times the function called
this child `/' the total number of times the child
was called.  Recursive calls by the child are not
listed in the number after the `/'.

     name This is the name of the child.  The child's index
number is printed after it.  If the child is a
member of a cycle, the cycle number is printed
between the name and the index number.

 If there are any cycles (circles) in the call graph, there is an
 entry for the cycle-as-a-whole.  This entry shows who called the
 cycle (as parents) and the members of the cycle (as children.)
 The `+' recursive calls entry shows the number of function calls that
 were internal to the cycle, and the calls entry for each member shows,
 for that member, how many times it was called from other members of
 the cycle.


Index by function name

   [3] __gcc_deregister_frame  [1] __mingw_pformat

2). codeblocks on Fedora14 x86_64 & the same simple .c file,
built and ran, then I got code profiler result as follows:
Code
Flat profile:

Each sample counts as 0.01 seconds.
 no time accumulated

  %   cumulative   self              self     total          
 time   seconds   seconds    calls  Ts/call  Ts/call  name    

 %         the percentage of the total running time of the
time       program used by this function.

cumulative a running sum of the number of seconds accounted
 seconds   for by this function and those listed above it.

 self      the number of seconds accounted for by this
seconds    function alone.  This is the major sort for this
           listing.

calls      the number of times this function was invoked, if
           this function is profiled, else blank.
 
 self      the average number of milliseconds spent in this
ms/call    function per call, if this function is profiled,
      else blank.

 total     the average number of milliseconds spent in this
ms/call    function and its descendents per call, if this
      function is profiled, else blank.

name       the name of the function.  This is the minor sort
           for this listing. The index shows the location of
      the function in the gprof listing. If the index is
      in parenthesis it shows where it would appear in
      the gprof listing if it were to be printed.

So, I think as Jens said, the C-libraries of debian (and ubuntu/mint includes Fedora) are not built with -pg flag set.
Maybe later, when I have time, I'll try to learn to build C-libraries of Fedora with the -pg flag set.
« Last Edit: April 02, 2011, 02:59:11 am by wangdong1226 »

Offline oBFusCATed

  • Developer
  • Lives here!
  • *****
  • Posts: 13413
    • Travis build status
wangdong1226: read the gprof manual and you'll understand why the profile is empty....
(most of the time I ignore long posts)
[strangers don't send me private messages, I'll ignore them; post a topic in the forum, but first read the rules!]

Offline wangdong1226

  • Multiple posting newcomer
  • *
  • Posts: 46
wangdong1226: read the gprof manual and you'll understand why the profile is empty....

OK, thanks oBFusCATed   :P
I'll read the gprof manual.

Best regards.
David.