SIGSEGV из-за переполнения стека при рекурсивном создании экземпляра кортежа С++C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 SIGSEGV из-за переполнения стека при рекурсивном создании экземпляра кортежа С++

Сообщение Anonymous »

Я вижу SISEGV, что, в частности, связано с тем, что указатель стека превышает нижний порог допустимого размера стека.
У меня есть процесс, который создает кортеж длиной около 140 элементов через std: :forward_as_tuple().
При сборке с неповрежденными символами отладки (-g) двоичный файл аварийно завершает работу и сообщает SIGSEGV.
При проверке /proc/
/maps, я мог видеть размер стека, который в настоящее время используется процессом:

Код: Выделить всё

7ffffffdb000-7ffffffff000 rw-p 00000000 00:00 0                          [stack]
что составляет 147456 байт.
При проверке трассировки стека двоичного файла я вижу, что значение 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
что указывает на то, что RSP находится на нижнем значении указателя размера стека (0x7ffffffdb000). И двоичный файл вылетает именно при вызове следующей рекурсивной функции (дизассемблирование на 0-м кадре):

Код: Выделить всё

... ; other instructions in 0th frame
=> 0x00007fffeffffab2 :   call   0x7fffeffffc62 
что указывает на SIGSEGV, поскольку память еще не сопоставлена ​​с процессом.
Я сомневаюсь, поскольку ulimit -s имеет 8 МБ:
Я сомневаюсь, что ulimit -s имеет 8 МБ:
р>

Код: Выделить всё

$ ulimit -s
8192
Разве ОС не должна позволять размеру стека процесса увеличиваться до 8 МБ, а затем аварийно завершать работу в случае нарушения?
Я вижу, что размер стека достигает всего около 147456 байт, и процесс завершается сбоем при глубоком рекурсивном создании экземпляра кортежа, вызванном вызовом std::forward_as_tuple.
Любые подсказки, чтобы точно определить, где проблема возникает?
Что я пробовал:
  • При работе с ulimit -s неограниченно -> проблема исчезает. Что на самом деле показывает, что размер стека нарушается, но каким-то образом используется только часть полезных 8 МБ, и все равно происходит сбой? В этом и есть сомнение.
  • Ищу в сети плоскую реализацию std::tuple, смогу ли я удалить этот рекурсивный вызов std::forward_as_tuple, но пока не могу найти подходящую.
    li>
Заранее спасибо.

Подробнее здесь: https://stackoverflow.com/questions/793 ... tantiation
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»