/ / Доступ до стека, виділеного потоку - c ++, налагодження

Доступ до стека, який виділяється потоку - c ++, налагодження

Я хочу знати, чи є його possble доступстек (виділений для потоку, який використовується для зберігання локальних змінних і т.д.) зміст proarmitically .Це може допомогти в моїх зусиль, щоб програмно визначити проблеми переповнення стека.

Відповіді:

1 для відповіді № 1

Не переносно, ні. Однак, залежно від платформи, яку ви використовуєте, ви зможете встановити розмір стека для кожного потоку. Наприклад, якщо ви використовуєте потоки POSIX, ви можете використовувати pthread_attr_setstacksize , щоб встановити розмір стека.


1 для відповіді № 2

У Unix можна налаштувати альтернативний стек сигналіві використовуйте це для виявлення переповнення стека (після бомби). Коли ваш потік переповнює стек (якщо ви або ОС ставить сторінку охоронця), ви можете подивитися на регістр стека в sigcontext_t, щоб побачити, що це "чому."

Якщо ви прагнете запобігти переповненню стекапрограмно виділити свій власний стек потоків, а потім періодично вибірка значення вказівника стека (вам доведеться мати справу з непрохідними проблемами того, де розташована ваша стекова база, і як відібрати покажчик стека). може використовувати основу стека як вибірка в основному, в порівнянні зі стеком процесу ulimit, щоб побачити, якщо ви надто далеко.

Все це не є портативним, але можливим.


0 для відповіді № 3

Немає портативного способу. Ви можете використовувати вбудований ассемблер, щоб визначити поточний покажчик стека всередині потоку, а потім знайти блок з цією адресою в карті пам'яті процесу.

Але зазвичай проблеми переповнення стеків визначаютьсяопераційна система. Коли виділяється стек для потоку або процесу, перед ним розміщується спеціальний сегмент пам'яті, в якому відключено читання і запис в цей сегмент. Коли ви втрачаєте стек, ваша програма досягає цього сегмента, і доступ до нього викличе системне виключення.