Replacing abort() with __builtin_trap()?

Поиск
Список
Период
Сортировка
От Andres Freund
Тема Replacing abort() with __builtin_trap()?
Дата
Msg-id 20230702174107.midcqczaufprjeff@awork3.anarazel.de
обсуждение исходный текст
Ответы Re: Replacing abort() with __builtin_trap()?
Список pgsql-hackers
Hi,

When looking at Assert() failures and at PANICs, the number of "pointless"
stack entries at the top seems to have grown over the years.  Here's an
example of a stacktrace (that I obviously intentionally triggered):

Program terminated with signal SIGABRT, Aborted.
#0  __pthread_kill_implementation (threadid=<optimized out>, signo=signo@entry=6, no_tid=no_tid@entry=0) at
./nptl/pthread_kill.c:44
44    ./nptl/pthread_kill.c: No such file or directory.
(gdb) bt
#0  __pthread_kill_implementation (threadid=<optimized out>, signo=signo@entry=6, no_tid=no_tid@entry=0) at
./nptl/pthread_kill.c:44
#1  0x00007f31920a815f in __pthread_kill_internal (signo=6, threadid=<optimized out>) at ./nptl/pthread_kill.c:78
#2  0x00007f319205a472 in __GI_raise (sig=sig@entry=6) at ../sysdeps/posix/raise.c:26
#3  0x00007f31920444b2 in __GI_abort () at ./stdlib/abort.c:79
#4  0x000055b3340c5140 in ExceptionalCondition (conditionName=0x55b3338c7ea0 "\"I kid you not\" == NULL",
    fileName=0x55b3338c6958 "../../../../home/andres/src/postgresql/src/backend/tcop/postgres.c", lineNumber=4126)
    at ../../../../home/andres/src/postgresql/src/backend/utils/error/assert.c:66
#5  0x000055b333ef46c4 in PostgresMain (dbname=0x55b336271608 "postgres", username=0x55b3361fa888 "andres")
    at ../../../../home/andres/src/postgresql/src/backend/tcop/postgres.c:4126
#6  0x000055b333e1fadd in BackendRun (port=0x55b336267ec0) at
../../../../home/andres/src/postgresql/src/backend/postmaster/postmaster.c:4461
#7  0x000055b333e1f369 in BackendStartup (port=0x55b336267ec0) at
../../../../home/andres/src/postgresql/src/backend/postmaster/postmaster.c:4189
#8  0x000055b333e1b406 in ServerLoop () at
../../../../home/andres/src/postgresql/src/backend/postmaster/postmaster.c:1779
#9  0x000055b333e1ad17 in PostmasterMain (argc=73, argv=0x55b3361f83f0) at
../../../../home/andres/src/postgresql/src/backend/postmaster/postmaster.c:1463
#10 0x000055b333d052e2 in main (argc=73, argv=0x55b3361f83f0) at
../../../../home/andres/src/postgresql/src/backend/main/main.c:198

That's due to glibc having a very complicated abort(). Which might be nice as
a backstop, but for the default Assert it's imo just noise.

I'd like to propose that we do a configure test for __builtin_trap() and use
it, if available, before the abort() in ExceptionalCondition(). Perhaps also
for PANIC, but it's not as clear to me whether we should.

Here's a backtrace when using __builtin_trap():
#0  ExceptionalCondition (conditionName=0x55e7e7c90ea0 "\"I kid you not\" == NULL",
    fileName=0x55e7e7c8f958 "../../../../home/andres/src/postgresql/src/backend/tcop/postgres.c", lineNumber=4126)
    at ../../../../home/andres/src/postgresql/src/backend/utils/error/assert.c:66
66        __builtin_trap();
(gdb) bt
#0  ExceptionalCondition (conditionName=0x55e7e7c90ea0 "\"I kid you not\" == NULL",
    fileName=0x55e7e7c8f958 "../../../../home/andres/src/postgresql/src/backend/tcop/postgres.c", lineNumber=4126)
    at ../../../../home/andres/src/postgresql/src/backend/utils/error/assert.c:66
#1  0x000055e7e82bd6c4 in PostgresMain (dbname=0x55e7e9ea8608 "postgres", username=0x55e7e9e31888 "andres")
    at ../../../../home/andres/src/postgresql/src/backend/tcop/postgres.c:4126
#2  0x000055e7e81e8add in BackendRun (port=0x55e7e9e9eec0) at
../../../../home/andres/src/postgresql/src/backend/postmaster/postmaster.c:4461
#3  0x000055e7e81e8369 in BackendStartup (port=0x55e7e9e9eec0) at
../../../../home/andres/src/postgresql/src/backend/postmaster/postmaster.c:4189
#4  0x000055e7e81e4406 in ServerLoop () at
../../../../home/andres/src/postgresql/src/backend/postmaster/postmaster.c:1779
#5  0x000055e7e81e3d17 in PostmasterMain (argc=73, argv=0x55e7e9e2f3f0) at
../../../../home/andres/src/postgresql/src/backend/postmaster/postmaster.c:1463
#6  0x000055e7e80ce2e2 in main (argc=73, argv=0x55e7e9e2f3f0) at
../../../../home/andres/src/postgresql/src/backend/main/main.c:198


Maybe I crash things too often, but I like to not have to deal with 4
pointless frames at the top...

Greetings,

Andres Freund



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

Предыдущее
От: Andres Freund
Дата:
Сообщение: 010_database.pl fails on openbsd w/ LC_ALL=LANG=C
Следующее
От: Tom Lane
Дата:
Сообщение: Re: Replacing abort() with __builtin_trap()?