คำถามติดแท็ก callstack


29
ข้อผิดพลาดเกินขนาดสูงสุดของสแต็ก
ฉันใช้ไฟล์ไลบรารี JavaScript Direct Direct Remoting (DWR) และฉันได้รับข้อผิดพลาดเฉพาะใน Safari (เดสก์ท็อปและ iPad) มันบอกว่า เกินขนาดสแต็กการโทรสูงสุด ข้อผิดพลาดนี้หมายถึงอะไรอย่างแน่นอนและมันหยุดการประมวลผลอย่างสมบูรณ์? ยังแก้ไขSafariเบราว์เซอร์ใด ๆ(จริง ๆ แล้วiPad Safariมันพูดว่า JS: การดำเนินการเกินเวลาที่กำหนด ที่ฉันสมมติว่าเป็นปัญหาการโทรสแต็คเดียวกัน)

6
อธิบายแนวคิดของกรอบสแต็คแบบสั้น ๆ
ดูเหมือนว่าฉันได้รับแนวคิดของcall stackในการออกแบบภาษาโปรแกรม แต่ฉันไม่สามารถหาได้ (อาจเป็นไปได้ว่าฉันแค่ค้นหาไม่หนักพอ) คำอธิบายที่เหมาะสมเกี่ยวกับสแต็คเฟรมคืออะไร ดังนั้นฉันอยากจะขอให้ใครบางคนอธิบายให้ฉันด้วยคำไม่กี่คำ
200 callstack 

2
ฉันจะสร้างข้อยกเว้นใหม่ใน Javascript ได้อย่างไร แต่เก็บสแต็คไว้?
ใน Javascript สมมติว่าฉันต้องการดำเนินการล้างข้อมูลเมื่อเกิดข้อยกเว้น แต่ให้ข้อยกเว้นดำเนินการต่อไปเพื่อกระจายสแต็กเช่น: try { enterAwesomeMode(); doRiskyStuff(); // might throw an exception } catch (e) { leaveAwesomeMode(); throw e; } doMoreStuff(); leaveAwesomeMode(); ปัญหาของรหัสนี้คือการจับและ rethrowing ข้อยกเว้นทำให้ข้อมูลการติดตามสแต็กถึงจุดนั้นหายไปดังนั้นหากข้อผิดพลาดถูกดักจับในภายหลังอีกครั้งสูงขึ้นบนสแต็กการติดตามสแต็กจะลงไปที่ -โยน. สิ่งนี้แย่เพราะมันหมายความว่ามันไม่มีฟังก์ชั่นที่ทำให้เกิดข้อยกเว้น ตามที่ปรากฎลอง .. ในที่สุดก็มีพฤติกรรมเหมือนกันใน Chrome อย่างน้อย (นั่นคือไม่ใช่การโยนซ้ำที่เป็นปัญหาอย่างแม่นยำ แต่มีตัวจัดการบล็อกข้อยกเว้นอยู่เลย) ไม่มีใครรู้วิธีที่จะ rethrow ข้อยกเว้นใน Javascript แต่รักษาร่องรอยสแต็คที่เกี่ยวข้องกับมันได้หรือไม่ ความล้มเหลวนั้นวิธีการเกี่ยวกับคำแนะนำสำหรับวิธีอื่น ๆ ในการเพิ่มตัวจัดการการล้างข้อมูลบนข้อยกเว้นที่ปลอดภัยขณะเดียวกันก็จับการติดตามสแต็กที่สมบูรณ์เมื่อมีข้อยกเว้นเกิดขึ้น ขอบคุณสำหรับคำแนะนำใด ๆ :)

13
พิมพ์ call stack ใน C หรือ C ++
มีวิธีใดในการถ่ายโอนข้อมูลการโทรในกระบวนการทำงานใน C หรือ C ++ ทุกครั้งที่เรียกใช้ฟังก์ชันบางอย่าง สิ่งที่ฉันคิดไว้มีดังนี้: void foo() { print_stack_trace(); // foo's body return } สถานที่print_stack_traceทำงานคล้ายกับcallerใน Perl หรือสิ่งนี้: int main (void) { // will print out debug info every time foo() is called register_stack_trace_function(foo); // etc... } ที่register_stack_trace_functionวางเบรกพอยต์ภายในบางประเภทที่จะทำให้การติดตามสแต็กถูกพิมพ์เมื่อใดก็ตามที่fooถูกเรียก สิ่งนี้มีอยู่ในไลบรารี C มาตรฐานหรือไม่? ฉันทำงานบน Linux โดยใช้ GCC พื้นหลัง ฉันมีการทดสอบที่ทำงานแตกต่างกันไปตามสวิตช์บรรทัดคำสั่งบางอย่างที่ไม่ควรส่งผลต่อพฤติกรรมนี้ รหัสของฉันมีตัวสร้างตัวเลขสุ่มหลอกที่ฉันคิดว่าถูกเรียกแตกต่างกันไปตามสวิตช์เหล่านี้ ฉันต้องการเรียกใช้การทดสอบกับสวิตช์แต่ละชุดและดูว่าตัวสร้างตัวเลขสุ่มถูกเรียกแตกต่างกันหรือไม่สำหรับแต่ละอัน
120 c++  c  linux  callstack 


7
callstack ทำงานอย่างไร?
ฉันพยายามทำความเข้าใจให้ลึกซึ้งยิ่งขึ้นว่าการทำงานของภาษาโปรแกรมระดับต่ำทำงานอย่างไรและโดยเฉพาะอย่างยิ่งวิธีที่พวกเขาโต้ตอบกับ OS / CPU ฉันอาจอ่านทุกคำตอบในทุกเธรดที่เกี่ยวข้องกับสแต็ก / ฮีปที่นี่ใน Stack Overflow และพวกเขาทั้งหมดยอดเยี่ยม แต่ยังมีสิ่งหนึ่งที่ฉันยังไม่เข้าใจ พิจารณาฟังก์ชันนี้ในรหัสหลอกซึ่งมีแนวโน้มที่จะเป็นรหัสสนิมที่ถูกต้อง ;-) fn foo() { let a = 1; let b = 2; let c = 3; let d = 4; // line X doSomething(a, b); doAnotherThing(c, d); } นี่คือวิธีที่ฉันถือว่าสแต็กมีลักษณะเป็นบรรทัด X: Stack a +-------------+ | 1 | b +-------------+ …

9
ทิศทางของการเติบโตแบบสแต็กในระบบสมัยใหม่ส่วนใหญ่เป็นอย่างไร?
ฉันกำลังเตรียมเอกสารการฝึกอบรมบางอย่างในภาษา C และฉันต้องการให้ตัวอย่างของฉันพอดีกับแบบจำลองกองซ้อนทั่วไป C stack เติบโตไปในทิศทางใดใน Linux, Windows, Mac OSX (PPC และ x86), Solaris และ Unixes ล่าสุด

4
ตัวแปรสแต็กถูกจัดแนวโดย GCC __attribute __ ((aligned (x))) หรือไม่
ฉันมีรหัสต่อไปนี้: #include <stdio.h> int main(void) { float a[4] __attribute__((aligned(0x1000))) = {1.0, 2.0, 3.0, 4.0}; printf("%p %p %p %p\n", &a[0], &a[1], &a[2], &a[3]); } และฉันมีผลลัพธ์ต่อไปนี้: 0x7fffbfcd2da0 0x7fffbfcd2da4 0x7fffbfcd2da8 0x7fffbfcd2dac ทำไมที่อยู่ของ a[0]ไม่ได้เป็นหลาย0x1000? อะไรกันแน่ __attribute__((aligned(x))) ? ฉันเข้าใจคำอธิบายนี้ผิด? ฉันใช้ gcc 4.1.2


1
เหตุใด DOS จึงตั้งค่า SP register เป็น 0xFFFE หลังจากโหลดไฟล์. COM
ในหน้า wikpedia เกี่ยวกับไฟล์. COM https://en.wikipedia.org/wiki/COM_fileจะอ่าน: ไฟล์. COM ใน DOS ตั้งค่าเซกเมนต์ x86 ทั้งหมดที่ลงทะเบียนเป็นค่าเดียวกันและ SP (ตัวชี้สแต็ค) ลงทะเบียนเป็น 0xFFFE ดังนั้นสแต็กจะเริ่มต้นที่ด้านบนสุดของเซ็กเมนต์หน่วยความจำและทำงานจากที่นั่น แต่นี่จะเป็นการตั้งค่าสแต็กให้เริ่มหนึ่งคำด้านล่างด้านบนของกลุ่ม เมื่อกดค่าบนสแต็ก CPU จะลด SP เป็น 0xFFFC และเก็บค่าไว้ที่นั่น สาเหตุที่ DOS ไม่ตั้งค่า SP เป็น 0 แทนคืออะไร
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.