質問
を使用していMinGW GCC3.4.5(mingw-特別vista r3).
私Cを利用して多くのスタックのような形で来ていたので迷ったら、本当にありがとうえしましたがprogramaticallyどのくらいのスタックが残りだったので綺麗に取り扱の状況を見つけましたがっています。
ない場合は他の方法としての問題が潜在的に行スタック。
私はそのサイズのスタックの私が始まり、そういう人を特定する必要があることをprogramaticallyます。
他のヒント
のgetrusage機能がご利用の現況.参照 man getrusage
).
の getrlimit
Linuxでは、controlelrディレクトリにてれば取得にスタックサイズの RLIMIT_STACK
パラメータとします。
#include <sys/resource.h>
int main (void)
{
struct rlimit limit;
getrlimit (RLIMIT_STACK, &limit);
printf ("\nStack Limit = %ld and %ld max\n", limit.rlim_cur, limit.rlim_max);
}
由来について教えてください見 man getrlimit
.同じ情報が取得 ulimit -s
または ulimit -a
スタックサイズです。またしてい setrlimit
機能によって設定します。その他の回答が必要な場合は調整スタックしてくだ再考えて設計されるようお願いします。したい場合に大きな配列を持っているメモリのからエディタで開き、ヒープ?
の住所の局所変数のスタックいます。それによりネストした通話でき差し引のアドレスの他の地域のこれらの差額について
size_t top_of_stack;
void Main()
{
int x=0;
top_of_stack = (size_t) &x;
do_something_very_recursive(....)
}
size_t SizeOfStack()
{
int x=0;
return top_of_stack - (size_t) &x;
}
場合はコードがマルチスレッドを必要な対応を格納するtop_of_stack変数は、スレッドベース。
をクリックしてくださのコンパイラを支えstackavail()
と仮定しているサイズのフルスタックではありません追加-一部組立てのコードを読みがあります。
読まれたESPに保存してください別の主な機能を比較することができ、現在のESPにESPいメインとなったESPが変わりました。ただ、表示がどのスタックだけを使います。
この問題になっています。多くのハッキング(概ね)を祈願できうソリューション作品を同時に与えられた。もすることができあう関係ではないかと思います。
お得にスタック位置とサイズに外部からのプログラム(Linuxを頂く場合がございま /proc/<pid>/maps
).プログラムが必要な試験がなくお楽しみいただけますスタックです。地を使用した変数であり保証するものに実際にスタックです。できもしないようにしていから値を取得しスタックポインタの登録あります。
いくことができました位置のスタックサイズのバッファの現在位置に関するお知る方向にスタックです。がくのスタック-オーバーフローモードになっていますか?きないあるいは上での推定(アドレスのローカル変数には値をスタックからのポインタ)からも楽観的ることはあまりありません住所の記憶を超えたスタックポインタです。また、こんなどのスタックの定機能(機能を呼び出しで)。なんだかなりある客室です。
できるだけで、決まりなくこの混乱しないようにして非常に深い再帰.きものを増やしたいおスタックサイズ;Windowsでコンパイルの実行ファイルを教えて頂けたらと思います。
Windows:私はこれを使用する前にVirtualQuery機能からKernel32.dll.今回の例ではC#での技術:
public static class StackManagement
{
[StructLayout(LayoutKind.Sequential)]
struct MEMORY_BASIC_INFORMATION
{
public UIntPtr BaseAddress;
public UIntPtr AllocationBase;
public uint AllocationProtect;
public UIntPtr RegionSize;
public uint State;
public uint Protect;
public uint Type;
};
private const long STACK_RESERVED_SPACE = 4096 * 16;
public unsafe static bool CheckForSufficientStack(UInt64 bytes)
{
MEMORY_BASIC_INFORMATION stackInfo = new MEMORY_BASIC_INFORMATION();
UIntPtr currentAddr = new UIntPtr(&stackInfo);
VirtualQuery(currentAddr, ref stackInfo, sizeof(MEMORY_BASIC_INFORMATION));
UInt64 stackBytesLeft = currentAddr.ToUInt64() - stackInfo.AllocationBase.ToUInt64();
return stackBytesLeft > (bytes + STACK_RESERVED_SPACE);
}
[DllImport("kernel32.dll")]
private static extern int VirtualQuery(UIntPtr lpAddress, ref MEMORY_BASIC_INFORMATION lpBuffer, int dwLength);
}
ちなみ:このコードについStackOverflow他の問いを聞きしていたバグを修正コード: 算術演算の結果、オーバーフローに安全でないC#入力リンクdescriptionこちら
この支援のためのWindowsプラットフォーム:
のPEヘッダー(IMAGE_NT_HEADERS)のエグゼが記録など
typedef struct _IMAGE_NT_HEADERS { DWORD Signature; IMAGE_FILE_HEADER FileHeader; IMAGE_OPTIONAL_HEADER32 OptionalHeader; } IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32; typedef struct _IMAGE_OPTIONAL_HEADER { ... DWORD SizeOfStackReserve; DWORD SizeOfStackCommit; ... }
ありが簡単に得るこれらの値は:使用GetModuleHandle(NULL)をお渡し致しますimagebase(ハンドル)のモジュールのアドレスを見つけることができます、IMAGE_DOS_HEADER構造をより簡のIMAGE_NT_HEADERS構造(imagebase+IMAGE_DOS_HEADER.e_lfanew)->IMAGE_NT_HEADERS、まだその分野: SizeOfStackReserve や SizeOfStackCommit.
最大限のスペースのOSでありますおスタックはSizeOfStackReserve.
だいこうと思います。方があるを得るサイズのスタックを使用。
Linux環境では、呼び出すとよいでしょうgetrusageチェック返されたstruct rusageの ru_isrss員一unsharedスタックサイズ)。
からのMINGWサイトとsourceforgeのサイトのトラッキングのパッチを見ることが2008年のあなたのパッチングを中心に行うことでgetrusageとなっているように見えますがて、一般的に、対応すね。を確認しておきましょう厳の他の注意などの典型的なLinuxの機能はMinGW.