2009-05-28 25 views
5

Birçok C/C++/Fortran ve diğer programcılar "yığın taşması" hatalarıyla karşılaşırlardı. Sorum şu: Program çalışırken yığının boyutunu izlememize veya denetlememize olanak tanıyan bir araç, bir program veya basit bir kod parçacığı var mı? Bu yığının biriktirildiği yeri ve sonunda taşmaya neden olan noktayı bulmak için yardımcı olabilir.Yığın boyutunu izleyerek yığın taşması nasıl önlenir?

cevap

1

Bunu sizin için yapacak bir program olup olmadığını bilmiyorum, ancak yığın işaretçisinin (en azından C ve C++) olduğu bir işlevin içinde kolayca kontrol edebilirsiniz. Sadece herhangi bir değişkenin hafıza konumuna bakın. Yerel konumlar yığınta tanımlandığından, tam konum olmayacak, ancak birkaç bayt içinde (sizin amaçlarınız için uygun olan) olmalıdır. Eğer tam bir değer istiyorsanız, bunu meclis üzerinden alabilirim.

Program çökerse yığın yığınına bakmak daha kolay olabilir.

+0

ve bir yerel değişkenin adresini en düşük yığın çerçevesinden (main()) global olarak erişilebilen bir değişkende saklarsanız, bunu "g_my_stack_base" olarak adlandırın, daha sonra yaklaşık yığın boyutlarını yaklaşık_stack_size = my_local_function_variable - g_my_stack_base ile herhangi bir işlevde kontrol edebilirsiniz. Çirkin ama işe yarıyor. İşaretçi aritmetiği bayt döndürecek şekilde char * işaretçileri kullandığınızdan emin olun. – tucuxi

1

Bu question'a bir bakın. Kabul cevap Raymond Chen değinir:

If you have to ask, you're probably doing something wrong. 

kesinlikle bunu yapmak gerekiyorsa, o zaman çözüm/aracı platformu bağımlı olacaktır. Kolay bir numara, yığını bilinen bir bayt değeriyle (ör. AA) doldurmak ve bu değere sahip olmayan birinci baytın konumunu izlemek. Bu, mevcut yığın boyutuna değil, kullanılan maksimum yığın boyutunu verecektir.

+0

Katılıyorum. Örneğin, DSP/BIOS işletim sistemi 0xDEADBEEF deseniyle yeni ayrılmış bir yığını doldurur ve yığın kullanımını izlemek için kullanır. Bir x86 işlemcisine alternatif bir yöntem (kolayca uygulanamaz, işletim sistemi tarafından yapılmalıdır), yığını ayrı bir bölüme koymak olacaktır. OS, daha sonra segment tanımlayıcısını tahsis edilen uzunluğa ayarlayabilir, böylece bir taşma bir GPF'ye neden olur, bu noktada yığın içeriği yukarı ve uzatılır. Bunu gerçekten uygulayan biri olsa bile emin değilim! –

İlgili konular