我可以问一个 运行 线程它已经使用了多少堆栈吗?
Can I ask a running thread about how much stack it has been using?
假设我在 Windows OS 上创建了一个线程,我知道默认堆栈大小远远超过所需。然后我可以 运行 应用程序并询问线程它实际使用的堆栈量,以便我知道我应该设置多少堆栈大小而不是默认堆栈大小?
Windows 通常不会 提交 整个堆栈,它只会 保留 它。 (好吧,除非你要求它这样做,例如通过为 CreateThread
指定 non-zero 堆栈大小参数而不同时传递 STACK_SIZE_PARAM_IS_A_RESERVATION
标志)。
您可以使用它来计算您的线程在 运行 期间需要多少堆栈,包括任何 CRT、WinAPI 或 third-party 库调用。
要做到这一点,只需阅读 TEB 中的 StackBase
和 StackLimit
值 - 请参阅 this question 的答案以了解如何做到这一点。这两个值的差值应该是已经提交的堆栈内存量,即-线程实际使用的堆栈内存量.
或者,如果手动过程就足够了:只需在 WinDBG 中启动应用程序,在线程退出前设置断点,然后使用 !teb
命令转储 TEB。您还可以使用 !address
转储整个内存映射,并使用 Stack
.
查找已提交的区域
假设我在 Windows OS 上创建了一个线程,我知道默认堆栈大小远远超过所需。然后我可以 运行 应用程序并询问线程它实际使用的堆栈量,以便我知道我应该设置多少堆栈大小而不是默认堆栈大小?
Windows 通常不会 提交 整个堆栈,它只会 保留 它。 (好吧,除非你要求它这样做,例如通过为 CreateThread
指定 non-zero 堆栈大小参数而不同时传递 STACK_SIZE_PARAM_IS_A_RESERVATION
标志)。
您可以使用它来计算您的线程在 运行 期间需要多少堆栈,包括任何 CRT、WinAPI 或 third-party 库调用。
要做到这一点,只需阅读 TEB 中的 StackBase
和 StackLimit
值 - 请参阅 this question 的答案以了解如何做到这一点。这两个值的差值应该是已经提交的堆栈内存量,即-线程实际使用的堆栈内存量.
或者,如果手动过程就足够了:只需在 WinDBG 中启动应用程序,在线程退出前设置断点,然后使用 !teb
命令转储 TEB。您还可以使用 !address
转储整个内存映射,并使用 Stack
.