2012-01-27 40 views
5

Làm cách nào để tìm kích thước ngăn xếp tối đa của chuỗi hiện tại?Cách tìm kích thước ngăn xếp tối đa của chuỗi hiện tại trong .net?

Tôi nhận được ngoại lệ tràn ngăn xếp trong khi thực hiện một chức năng từ giao diện người dùng MMC nhưng không phải từ Powershell (dòng lệnh/bảng điều khiển). Vì vậy, tôi là loại đoán của nó một cái gì đó để làm với kích thước ngăn xếp mặc định được phân bổ trong thread UI để rằng trong Powershell (dòng lệnh/console).

Vậy làm cách nào để tìm kích thước ngăn xếp tối đa của chuỗi hiện tại? Tôi biết lý tưởng là không cần phải biết những điều này hoặc thiết lập chúng, nhưng có vẻ như nó liên quan đến kích thước ngăn xếp vì nó hoạt động từ console/powershell (ứng dụng dòng lệnh) không phải từ giao diện người dùng.

Notes (dưới thread loại liên quan nhưng nó không trả lời câu hỏi của tôi có thể cung cấp cho một số hướng dẫn..)

Maximum Thread Stack Size .NET?

Để biết thêm deails về vấn đề thực tế:

StackOverFlowException: Is it programming error (recursion) or not enough maximum default stack size?

Trả lời

2

Nhận thông tin này là PITA thực sự:

  1. Lấy thread ID sử dụng GetCurrentThreadId
  2. Sử dụng OpenThread để có được một xử lý cho các chủ đề
  3. Bây giờ sử dụng NtQueryInformationThread để có được thông tin về các chủ đề. Bạn sẽ sử dụng ThreadBasicInformation làm THREADINFOCLASS để có cấu trúc THREAD_BASIC_INFORMATION. Bạn hiện có thông số TebBaseAddress là địa chỉ của khối Môi trường chủ đề.
  4. Đọc trong bộ nhớ quá trình tại địa chỉ TebBaseAddress.
  5. Trong khối Chủ đề môi trường (TEB), bạn có quyền truy cập vào thuộc tính StackLimit là giá trị bạn đang tìm kiếm.

Từ bước 3, nó không có giấy tờ. Đó là lý do tại sao tôi không khuyên bạn nên lấy thông tin này.

1

Từ Windows 8, có chức năng GetCurrentThreadStackLimits(). Bạn có thể sử dụng nó từ C# qua PInvoke như thế này:

[DllImport("kernel32.dll")] 
static extern void GetCurrentThreadStackLimits(out uint lowLimit, out uint highLimit); 

uint low; 
uint high; 

GetCurrentThreadStackLimits(out low, out high); 
var size = (high - low)/1024; // in KB 

Trên máy tính của tôi, điều này mang lại 1MB trong một ứng dụng giao diện điều khiển, 256KB trong một ứng dụng web (IIS).

Các vấn đề liên quan