develooper Front page | perl.qa | Postings from August 2022

Re: Having memory leak issues with perl-c

Thread Previous | Thread Next
From:
Mark Murawski
Date:
August 12, 2022 22:11
Subject:
Re: Having memory leak issues with perl-c
Message ID:
fbad6b32-ae5a-d5c9-3d87-ba5d79f9606e@intellasoft.net
On 8/4/22 15:10, demerphq wrote:
> On Thu, 4 Aug 2022 at 17:04, Mark Murawski 
> <markm-lists@intellasoft.net> wrote:
>
>     On 8/4/22 02:50, demerphq wrote:
>>     On Thu, 4 Aug 2022 at 01:58, Mark Murawski
>>     <markm-lists@intellasoft.net> wrote:
>>
>>         I'm still not getting something... if I want to fix the
>>         code-as-is and do this:
>>
>>             FNsv = get_sv("main::_FN", GV_ADD);
>>             if (!FNsv)
>>                 ereport(ERROR,
>>         (errcode(ERRCODE_EXTERNAL_ROUTINE_EXCEPTION),
>>                          errmsg("couldn't fetch $_FN")));
>>
>>             save_item(FNsv);            /* local $_FN */
>>
>>
>>     I dont get the sequence here. You take the old value of
>>     $main::_FN and then you localize it after you fetch it? That
>>     seems weird.
>
>
> You did not respond to this comment ^^


The reason for the save_item*( was because I was modeling this code on 
another section that uses save_item() to accomplish something similar 
(to send internal postgres details to some perl).  I don't know why the 
original author uses save_item() for this purpose.




>
> No, you shouldn't do anything after creating the hash that might die 
> until you have arranged for hv to be freed. Storing into the hash 
> might die.

Got it.

>
>>     Obviously in perl we can write:
>>
>>     my %hash;
>>     $main::_FN= \%hash;
>>
>>     And in XS we can do the same thing. Unfortunately there isn't a
>>     utility sub to do this currently, it has been on my TODO list to
>>     add one for some time but lack of round tuits and all that.
>>
>>     You want code something like this:
>>
>>     sv_clear(FNsv); /* undef the sv */
>>     sv_upgrade(FNsv,SVt_RV);
>>     SvRV_set(FNsv, (SV*)hv);
>>     SvROK_on(FNsv);
>>
>>     Again, make liberal use of sv_dump() it is the XS version of
>>     Data::Dumper more or less.
>


>
>     Also... i get a crash when I use sv_clear(FNsv); right away like this.
>
>
> And what does FNsv look like immediately before you call sv_clear()?


I'm on vacation and I'm working on this as I get the time.... I wasn't 
able to attach gdb and get anything meaningful, but based on the newly 
added debugs you can tell where it's crashing




> Can you please show a reduced version of the code? And explain why you 
> are doing save_item(FNsv)? And provide some of the output of sv_dump()?
>

save_item... details above..
And trimmed new code:

    // New .......... {
     FNsv = get_sv("main::_FN", GV_ADD);
     if (!FNsv) {
         ereport(ERROR,
                 (errcode(ERRCODE_EXTERNAL_ROUTINE_EXCEPTION),
                  errmsg("couldn't fetch $_FN")));
     }

     fprintf(stderr, "POST get_sv\n");
     sv_dump(FNsv);

     save_item(FNsv);            /* local $_FN */

     hv = newHV();               // create new hash

     fprintf(stderr, "PRE sv_clear/sv_upgrade/SvRV_set/SvROK_on\n");

     fprintf(stderr, "PRE sv_clear\n");
     sv_clear(FNsv); /* undef the sv */
     fprintf(stderr, "POST sv_clear\n");
     sv_dump(FNsv);

     fprintf(stderr, "PRE sv_upgrade svtype: %d, %d %d\n", SvTYPE(FNsv), 
SVt_NULL, SVt_PVIO);
     sv_upgrade(FNsv,SVt_RV);
     //SvUPGRADE(FNsv, SVt_RV);
     fprintf(stderr, "POST sv_upgrade\n");
     sv_dump(FNsv);

     fprintf(stderr, "PRE sv_set/on\n");
     SvRV_set(FNsv, (SV*)hv);
     SvROK_on(FNsv);
     fprintf(stderr, "POST sv_set/on\n");
     sv_dump(FNsv);

     fprintf(stderr, "POST sv_clear/sb_upgrade/SvRV_set/SvROK_on\n");
     sv_dump(FNsv);

     // Anything below might die().. so we do all our setup above

     hv_store_string(hv, "name", cstr2sv(desc->proname));
     // new .............. }

Output:
POST get_sv
SV = NULL(0x0) at 0x55adeea14e40
   REFCNT = 1
   FLAGS = ()
PRE sv_clear/sv_upgrade/SvRV_set/SvROK_on
PRE sv_clear
POST sv_clear
SV = UNKNOWN(0xff) (0x0) at 0x55adeea14e40
   REFCNT = 1
   FLAGS = ()
PRE sv_upgrade svtype: 255, 0 15
sv_upgrade from type 255 down to type 1.
2022-08-12 17:56:57 EDT -  -  -  - 7387 -  - 0 - LOG:  server process 
(PID 11614) was terminated by signal 11: Segmentation fault


Basically my gdb session is useless and results in this:

Program terminated with signal SIGSEGV, Segmentation fault.
#0  0x00007fcf6ae24c7f in ?? ()
(gdb) bt
#0  0x00007fcf6ae24c7f in ?? ()
Backtrace stopped: Cannot access memory at address 0x7ffce563e4b0



Thanks!
Thread Previous | Thread Next


nntp.perl.org: Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at ask@perl.org | Group listing | About