У меня получился этот странный сбой, и я понятия не имею, как отлаживать дамп ядра, поскольку по какой-то причине стек вызовов отсутствует информация о символах, за исключением последней функции:GDB отладка coredump с отсутствующими таблицами символов для определенного стека вызовов
#0 BIH::intersectRay<VMAP::MapRayCallback> (this=0x7f47b8339608, r=..., intersectCallback=..., [email protected]: 0, stopAtFirst=true, los=<optimized out>) at ../BIH.h:223
#1 0x000000307ff00000 in ??()
#2 0x7ff0000000000000 in ??()
#3 0x0000000000000030 in ??()
#4 0x000000307ff00000 in ??()
#5 0x7ff0000000000000 in ??()
#6 0x0000000000000030 in ??()
#7 0x000000307ff00000 in ??()
#8 0x7ff0000000000000 in ??()
#9 0x0000000000000030 in ??()
#10 0x000000307ff00000 in ??()
#11 0x7ff0000000000000 in ??()
#12 0x0000000000000030 in ??()
#13 0x000000307ff00000 in ??()
#14 0x7ff0000000000000 in ??()
#15 0x0000000000000030 in ??()
#16 0x000000307ff00000 in ??()
#17 0x7ff0000000000000 in ??()
#18 0x0000000000000030 in ??()
#19 0x000000307ff00000 in ??()
#20 0x7ff0000000000000 in ??()
#21 0x0000000000000030 in ??()
#22 0x000000307ff00000 in ??()
....
#749 0x7ff0000000000000 in ??()
#750 0x0000000000000030 in ??()
#751 0x000000307ff00000 in ??()
#752 0x7ff0000000000000 in ??()
#753 0x0000000000000030 in ??()
#754 0x000000307ff00000 in ??()
#755 0x7ff0000000000000 in ??()
#756 0x0000000000000030 in ??()
#757 0x000000307ff00000 in ??()
#758 0x7ff0000000000000 in ??()
#759 0x0000000000000030 in ??()
#760 0x000000307ff00000 in ??()
#761 0x7ff0000000000000 in ??()
#762 0x0000000000000030 in ??()
#763 0x000000307ff00000 in ??()
#764 0x03010102464c457f in ??()
#765 0x0000000000000000 in ??()`
(gdb) info frame 0
Stack frame at 0x7f493af83830:
rip = 0x930f0b in BIH::intersectRay<VMAP::MapRayCallback> (../BIH.h:223); saved rip = 0x307ff00000
called by frame at 0x7f493af83838
source language c++.
Arglist at 0x7f493af83438, args: this=0x7f47b8339608, r=..., intersectCallback=..., [email protected]: 0, stopAtFirst=true, los=<optimized out>
Locals at 0x7f493af83438, Previous frame's sp is 0x7f493af83830
Saved registers:
rbx at 0x7f493af837f8, rbp at 0x7f493af83800, r12 at 0x7f493af83808, r13 at 0x7f493af83810, r14 at 0x7f493af83818, r15 at 0x7f493af83820, rip at 0x7f493af83828
#1 0x000000307ff00000 in ??()
No symbol table info available.
(gdb) info frame 1
Stack frame at 0x7f493af83838:
rip = 0x307ff00000; saved rip = 0x7ff0000000000000
called by frame at 0x7f493af83840, caller of frame at 0x7f493af83830
Arglist at 0x7f493af83828, args:
Locals at 0x7f493af83828, Previous frame's sp is 0x7f493af83838
Saved registers:
rip at 0x7f493af83830
#2 0x7ff0000000000000 in ??()
No symbol table info available.
(gdb) info frame 2
Stack frame at 0x7f493af83840:
rip = 0x7ff0000000000000; saved rip = 0x30
called by frame at 0x7f493af83848, caller of frame at 0x7f493af83838
Arglist at 0x7f493af83830, args:
Locals at 0x7f493af83830, Previous frame's sp is 0x7f493af83840
Saved registers:
rip at 0x7f493af83838
#3 0x0000000000000030 in ??()
No symbol table info available.
(gdb) info frame 3
Stack frame at 0x7f493af83848:
rip = 0x30; saved rip = 0x307ff00000
called by frame at 0x7f493af83850, caller of frame at 0x7f493af83840
Arglist at 0x7f493af83838, args:
Locals at 0x7f493af83838, Previous frame's sp is 0x7f493af83848
Saved registers:
rip at 0x7f493af83840
#4 0x000000307ff00000 in ??()
No symbol table info available.
(gdb) info frame 4
Stack frame at 0x7f493af83850:
rip = 0x307ff00000; saved rip = 0x7ff0000000000000
called by frame at 0x7f493af83858, caller of frame at 0x7f493af83848
Arglist at 0x7f493af83840, args:
Locals at 0x7f493af83840, Previous frame's sp is 0x7f493af83850
Saved registers:
rip at 0x7f493af83848
Код составлен с использованием -g -fvar-tracking -O2 -march=native
.
У меня были разные дампы для различных сбоев, которые работали на всех таблицах символов и предоставляли соответствующие стеки вызовов и информацию, но по какой-то причине этот конкретный сбой является загадочным.
Одна вещь, которую я заметил, это повторяющиеся снова и снова повторяющиеся номера адресов, может ли быть какой-то бесконечный цикл или рекурсия каких-то сортов, которые развращают или переполняют стек?
Если это так, есть ли способ получить верхнюю часть большинства функций в стеке вызовов (например, любой способ перейти выше кадра # 765 или получить функции, вызванные до того, как было запущено переполнение)?
Я не могу установить $sp
или jump
на любой адрес из-за этого, я не могу отлаживать и проходить через живую программу, просто проанализируйте дамп ядра.
Я не могу повторить этот крах, это происходит на производстве время от времени. Также не может быть и речи.
Есть ли какие-либо параметры компилятора g++
или gdb
флаги, которые могут мне помочь?
Любые указатели на то, как отлаживать такую проблему, оцениваются (если возможно вообще).
Благодарим вас за подробный ответ, к сожалению, проблема была поврежденным стекем и была вызвана некоторыми плохими проверками, распространяющими некоторые UB (вызванные некоторыми значениями NaN) вниз по стеку вызовов. Обязательно взгляните на адрес Sanitizer tho, спасибо за предложение. – lousybyte