• gprof report incomplete

    From Ben Collver@21:1/5 to All on Sun Jul 31 22:34:45 2022
    I am trying to use gprof in DJGPP 2.05. I wrote a small test program
    named hello.c. On Linux, gprof correctly reports 10 calls to
    function helloworld. With DJGPP, gprof reports an undefined number
    of calls to __dpmi_int and nothing else.

    I have included the program source and output below [1].

    I reviewed the DJGPP FAQ chapter 13 to verify that i ran gprof
    correctly. https://www.delorie.com/djgpp/v2faq/faq13_1.html

    I am not sure how to troubleshoot this further. Any other ideas?

    Thanks!
    -Ben

    [1]
    bash-5.1$ cat hello.c
    #include <stdio.h>

    void helloworld(void) {
    printf("hello world\r\n");
    }

    int main(int argc, char *argv[]) {
    int i;
    for (i = 0; i < 10; i++) {
    helloworld();
    }
    }
    bash-5.1$ gcc -pg -o hello hello.c
    bash-5.1$ ./hello
    hello world
    hello world
    hello world
    hello world
    hello world
    hello world
    hello world
    hello world
    hello world
    hello world
    bash-5.1$ gprof hello|head
    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
    0.00 0.00 0.00 10 0.00 0.00 helloworld
    % the percentage of the total running time of the


    gcc --version
    gcc.exe (GCC) 7.2.0
    ...
    gcc -pg -o hello.exe hello.c
    hello.exe
    hello world
    hello world
    hello world
    hello world
    hello world
    hello world
    hello world
    hello world
    hello world
    hello world
    gprof hello.exe | head
    Flat profile:

    Each sample counts as 0.0555556 seconds.
    % cumulative self self total
    time seconds seconds calls Ts/call Ts/call name
    100.00 0.11 0.11 __dpmi_int

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


    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From [via djgpp@delorie.com]" @21:1/5 to All on Mon Aug 1 14:19:39 2022
    From: "Ben Collver (bencollver@tilde.pink) [via djgpp@delorie.com]" <djgpp@delorie.com>
    Date: Sun, 31 Jul 2022 22:34:45 -0000 (UTC)

    I am trying to use gprof in DJGPP 2.05. I wrote a small test program
    named hello.c. On Linux, gprof correctly reports 10 calls to
    function helloworld. With DJGPP, gprof reports an undefined number
    of calls to __dpmi_int and nothing else.

    I think this is more or less expected, given that (a) the profile
    timer has a relatively low frequency in DJGPP (just 18.2 Hz), that
    (b) the heavy processing of printf is in triggering switch from
    protected mode to real mode and invoking a DOS interrupt (which
    is what __dpmi_int does), and (c) that the profile timer is
    effectively disabled during the time the CPU is in real mode.

    I am not sure how to troubleshoot this further. Any other ideas?

    Why is it important to profile such toy programs? What real-life
    problem did you encounter that led you to try the above?

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Ben Collver@21:1/5 to djgpp@delorie.com on Mon Aug 1 15:25:13 2022
    On 2022-08-01, Eli Zaretskii (eliz@gnu.org) [via djgpp@delorie.com] <djgpp@delorie.com> wrote:
    Why is it important to profile such toy programs? What real-life
    problem did you encounter that led you to try the above?

    Thank you for your response. The "real-life problem" happened when i
    tried to profile a game named Angband 4.2.4. I compiled and linked
    angband with -pg and when i ran angband.exe i got the error below [1].
    I am also including a short gdb trace below [2] and the definition of
    the argv0 variable below [3].

    This crash only happens when i build angband with -pg. It does not
    happen in a normal build nor in a debug build.

    I wrote the toy program in an attempt to simplify the situation and get
    more familiar with gprof.

    -Ben

    [1]
    Exiting due to signal SIGSEGV
    Page fault at eip=00150b91, error=0004
    eax=00181afc ebx=00000000 ecx=00000000 edx=002e7b84 esi=0022e198
    edi=0000000c
    ebp=0022db88 esp=0022db60 program=C:\GAMES\ANGBAND\ANGBAND.EXE
    cs: sel=00a7 base=00400000 limit=002effff
    ds: sel=00af base=00400000 limit=002effff
    es: sel=00af base=00400000 limit=002effff
    fs: sel=008f base=00005920 limit=0000ffff
    gs: sel=00bf base=00000000 limit=0010ffff
    ss: sel=00af base=00400000 limit=002effff
    App stack: [0022dbf8..001adbfc] Exceptn stack: [001adb48..001abc08]

    Call frame traceback EIPs:
    0x00150b91

    [2]
    (gdb) l main
    313 * Note the special "--" option which terminates the processing
    of
    314 * standard options. All non-standard options (if any) are
    passed
    315 * directly to the "init_xxx()" function.
    316 */
    317 int main(int argc, char *argv[])
    318 {
    319 int i;
    320 bool new_game = alse, select_game = false;
    321 bool done = false;
    322
    (gdb) l
    323 const char *mstr = NULL;
    324 bool args = true;
    325
    326 /* Save the "program name" XXX XXX XXX */
    327 argv0 = argv[0];
    328
    ...
    (gdb) b 327
    Breakpoint 1 at 0x150b91: file main.c, line 327.
    (gdb) r
    Starting program: c:/games/angband/angband.exe

    Breakpoint 1, main (argc=1, argv=0x22e3b0) at main.c:327
    327 argv0 = argv[0];
    (gdb) p argv
    $1 = (char **) 0x22e3b0
    (gdb) p argv[0]
    $2 = 0x22e350 "c:/games/angband/angband.exe"
    (gdb) p argv0
    $3 = 0x0
    (gdb) p &argv0
    $4 = (char **) 0x1a6444 <argv0>
    (gdb) s

    Thread 1 received signal SIGSEGV, Segmentation fault.
    main (argc=1, argv=0x22e3b0) at main.c:327
    327 argv0 = argv[0];
    (gdb) _

    [3]
    From src/z-util.c:

    /**
    * Convenient storage of the program name
    */
    char *argv0 = NULL;

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)