Re: maximum number of backtrace frames logged by backtrace_functions

Поиск
Список
Период
Сортировка
От Yugo NAGATA
Тема Re: maximum number of backtrace frames logged by backtrace_functions
Дата
Msg-id 20220302154704.516286896b6f8ca924b2e384@sraoss.co.jp
обсуждение исходный текст
Ответ на Re: maximum number of backtrace frames logged by backtrace_functions  (Fujii Masao <masao.fujii@oss.nttdata.com>)
Список pgsql-docs
On Sat, 19 Feb 2022 01:05:04 +0900
Fujii Masao <masao.fujii@oss.nttdata.com> wrote:

> 
> 
> On 2022/02/18 19:59, Peter Eisentraut wrote:
> > On 18.02.22 09:24, Fujii Masao wrote:
> >> Or even backtrace should be logged by write_stderr() so that it's written to eventlog if necessary? I just wonder
whybacktrace_symbols_fd() is used only in ExceptionalCondition().
 
> > 
> > Probably because it was simpler.  It would also make sense to convert the whole thing to use write_stderr()
consistently.
> +1
> Attached is the updated version of the patch that uses write_stderr() to log the backtrace in assertion failure
case.
> 
> +        if (nframes >= lengthof(buf))
> +            appendStringInfo(&errtrace, "\n(backtrace limited to %zu frames)",
> +                             lengthof(buf));
> 
> I found this doesn't work on FreeBSD, at least FreeBSD 13 that cfbot uses on Cirrus CI. When the backtrace is larger
than100, on FreeBSD, backtrace() seems to write the *99* (not 100) most recent function calls to the buffer. That is,
thevariable "nframes" is 99 while lengthof(buf) indicates 100. So the above message about backtrace limit will never be
loggedon FreeBSD. OTOH, on Linux and MacOS, backtrace() writes the 100 most recent function calls. I'm not sure if such
abehavior on FreeBSD is expected or a bug.
 
> 
> To issue the message whatever OS is, probably we need to modify set_backtrace() as follows, for example. But is this
overkill?Thought?
 
> 
> 
> -        void       *buf[100];
> +#define    BACKTRACE_MAX_FRAMES    100
> +        void       *buf[BACKTRACE_MAX_FRAMES + 1];
>           int            nframes;
>           char      **strfrms;
>   
>           nframes = backtrace(buf, lengthof(buf));
> +        if (nframes > BACKTRACE_MAX_FRAMES)
> +            nframes = BACKTRACE_MAX_FRAMES;
>           strfrms = backtrace_symbols(buf, nframes);
>           if (strfrms == NULL)
>               return;
>   
>           for (int i = num_skip; i < nframes; i++)
>               appendStringInfo(&errtrace, "\n%s", strfrms[i]);
> +        if (nframes >= BACKTRACE_MAX_FRAMES)
> +            appendStringInfo(&errtrace, "\n(backtrace limited to %d frames)",
> +                             BACKTRACE_MAX_FRAMES);

I think it would be better that users can get the same results in
different OS as as possible.

I have another comment. When the backtrace is output from elog, 
two rows are skipped by num_skip and only 98 frames will appear
even though it is said "backtrace limited to 100 frames". So, how
about reporting the limiting number subtracted by num_skip, like this:

    if (nframes >= lengthof(buf))
        appendStringInfo(&errtrace, "\n(backtrace limited to %zu frames)",
                        lengthof(buf) - num_skip);

 or

    if (nframes >= BACKTRACE_MAX_FRAMES)
            appendStringInfo(&errtrace, "\n(backtrace limited to %d frames)",
                             BACKTRACE_MAX_FRAMES - num_skip);

Regards,
Yugo Nagata

-- 
Yugo NAGATA <nagata@sraoss.co.jp>



В списке pgsql-docs по дате отправления:

Предыдущее
От: Martín Marqués
Дата:
Сообщение: Re: pgAdmin 4 (APT) installation error
Следующее
От: asalias mark
Дата:
Сообщение: offline print option.