У меня есть процесс, который создает кортеж длиной около 140 элементов через std: :forward_as_tuple().
При сборке с неповрежденными символами отладки (-g) двоичный файл аварийно завершает работу и сообщает SIGSEGV.
При проверке /proc/
/maps, я мог видеть размер стека, который в настоящее время используется процессом:
Код: Выделить всё
7ffffffdb000-7ffffffff000 rw-p 00000000 00:00 0 [stack]
При проверке трассировки стека двоичного файла я вижу, что значение rsp указателя последнего кадра равно:
Код: Выделить всё
#0 0x00007fffeffffab2 in std::_Tuple_impl::_Tuple_impl (
this=0x7fffffff2660, __head=@0x7ffff05751d0: 0, __tail#0=@0x7ffff05751d8: 0, __tail#1=@0x7ffff05751e0: 0,
__tail#2=@0x7ffff05751e8: 0, __tail#3=@0x7ffff05751f0: 0, __tail#4=@0x7ffff05751f8: 0,
__tail#5=@0x7ffff0575200: 0, __tail#6=@0x7ffff0575208: 0, __tail#7=@0x7ffff0575210: 0,
__tail#8=@0x7ffff0575218: 0, __tail#9=@0x7ffff0575220: 0, __tail#10=@0x7ffff0575228: 0,
__tail#11=@0x7ffff0575230: 0, __tail#12=@0x7ffff0575238: 0, __tail#13=@0x7ffff0575240: 0,
__tail#14=@0x7ffff0575248: 0, __tail#15=@0x7ffff0575250: 0, __tail#16=@0x7ffff0575258: 0,
__tail#17=@0x7ffff0575260: 0, __tail#18=@0x7ffff0575268: 0, __tail#19=@0x7ffff0575270: 0,
__tail#20=@0x7ffff0575278: 0, __tail#21=@0x7ffff0575280: 0, __tail#22=@0x7ffff0575288: 0,
__tail#23=@0x7ffff0575290: 0, __tail#24=@0x7ffff0575298: 0, __tail#25=@0x7ffff05752a0: 0,
__tail#26=@0x7ffff05752a8: 0, __tail#27=@0x7ffff05752b0: 0, __tail#28=@0x7ffff05752b8: 0)
at /usr/include/c++/12.2.0/tuple:284
284 in /usr/include/c++/12.2.0/tuple
(gdb) x $rsp
0x7ffffffdb000: 0xf0575200
Код: Выделить всё
... ; other instructions in 0th frame
=> 0x00007fffeffffab2 : call 0x7fffeffffc62
Я сомневаюсь, поскольку ulimit -s имеет 8 МБ:
Я сомневаюсь, что ulimit -s имеет 8 МБ:
р>
Код: Выделить всё
$ ulimit -s
8192
Я вижу, что размер стека достигает всего около 147456 байт, и процесс завершается сбоем при глубоком рекурсивном создании экземпляра кортежа, вызванном вызовом std::forward_as_tuple.
Любые подсказки, чтобы точно определить, где проблема возникает?
Что я пробовал:
- При работе с ulimit -s неограниченно -> проблема исчезает. Что на самом деле показывает, что размер стека нарушается, но каким-то образом используется только часть полезных 8 МБ, и все равно происходит сбой? В этом и есть сомнение.
- Ищу в сети плоскую реализацию std::tuple, смогу ли я удалить этот рекурсивный вызов std::forward_as_tuple, но пока не могу найти подходящую.
li>
Подробнее здесь: https://stackoverflow.com/questions/793 ... tantiation