Ещё одна причина, почему не следует разбазаривать свободное место в стеке.


? Microsoft, ?? ??????? ????, ? ??? ??? ?????, ??? ????????????? Windows, ?????? ??????? ????????? ??????? ??????? ???????, ????? ? ?????? ?????. ?????????????? ????? ??? ??????? ???????????? ? ????????. ???? ????? ???? ???????? ??????????????? ????????, ?? ?????? ?? ????? ??????? ???????? crash dump ??? ????? ?????? ????????? – ??? ?????????? remote. ???????? ?????????? ?? ??????? «remote.exe», ??????? ???? ? ????????? ? «WinDbg.exe» ? ??????, ? ?????-??, ???? ?????, ??? ? Telnet, ?? ????? ??????????? ????? (named pipes). ?? ??????????? ????, ?????? ?????? ???? ???????????? ??? ?? Telnet. ??? ???? ??? ???? ???????. ?? ? ?????????? ?? ????.

??? ???, ?????????? ????????????? ?????????? ???????????? ???????? ? ????, ??? ??????????? ????? ???????, ?? ??????????? ?????? ?? ??????? ?? ?????????? ?????, ????? ????????? ???????? ? ???????? ????????? ?????? ????????. ??????????? ?? ??? ?????? ????????? ??????? “!analyze –v”. ?????? ???? ?????? ???????? ?????????? “!analyze –v” ????? ?????????? ????????? ????? ???? ?? ??????????? ????? ? ?? ???? – ?????????? ????????? ????. ???????? ??? ?????? ???????, ??? ??? ???????? ?????? ????????? ??????.
?????? ???????????, ??? ?? ????? ???????????? ???????, ???????, ????????, ????????? ????????? ????? ? ?????:

 

void GreedyBastard()
{
char buffer[0x10000]; // 64K is enough for anyone.

}

??????????? ?????, ??? ??????? ????????? ?????????, ? ??? ????????????? ????????? ? ?????? ?????? ???????. ??? ??????????, ???? ???? ??????? ?????? ?????????? ??????????? ?? ??????? ???????? ??? ?????? ? ?????? ????? ? ???, ??? ???? ??????? ??????????? ????. ?????????? ????? ????? ??? ????, ??? ??????? ????? ?????????? ?????????? ???? ???????. ??? ???? ????? ????? ????? ?? ??????? ?? ???????????? ????? ???????. ???? ???? ?? ???? ????????, ??? ???????? ???????????? ????????? ???? ?? ?????. ??? ?? ????, ??? ?? ????? ?????????? ??????? ?? ??? ????? ????? ?? ???????. ??????????? ??????? «??? – ?? ???» ? ???? «?? ???», ?? ????? ???????????? ????, ??? ??? ????????? «!analyze -v». ??? ??? ???? ??? ??????, ?? ??? ???????? ??????????. 🙂

Cross-posted from blog.not-a-kernel-guy.com.

Comments (2)
  1. Anonymous says:

    > А в 64-бит ситемах 64к буфер в стеке все еще проблема?

    Зависит от того, о какой функции одет речь. Для некоторых и 4K проблема.

    > И как происходит переполнение стека в 32-бит?

    В смысле? Бросается исключение "stack overflow" или "access denied" – в зависимости от того, как именно переполнился стек.

    > Есть ли отличия в схеме проблемы в зависимости от того, где эта "много-жрущая" функция находится: в kernel-space, user-space или гипервизоре?

    Конечно. Размер ядерного стека – 6K по умолчанию. Вляд ли стек в гипервизоре больше. Да и в user space далеко не всегда можно позволить себе откушать 4KB. Хотя обычно – можно.

    > И оптимальный способ выделения памяти в каждом случае свой или есть общие рекомендации?

    Обычно в каждом случае – свой. В процессе работы обычно вырабатывается интуитивный критерий – сколько можно, а сколько – нет. Чаще всего проблема даже не в самом размере, а в том, что размер фиксированный там где нужен динамический буфер.

  2. IL says:

    Здравствуйте.

    А в 64-бит ситемах 64к буфер в стеке все еще проблема?

    И как происходит переполнение стека в 32-бит?

    Есть ли отличия в схеме проблемы в зависимости от того, где эта "много-жрущая" функция находится: в kernel-space, user-space или гипервизоре?

    И оптимальный способ выделения памяти в каждом случае свой или есть общие рекомендации?

Comments are closed.

Skip to main content