2017-10-09 53 views
6

Tôi nhận ra có nhiều nơi tôi có thể đặt câu hỏi này nhưng tôi nghĩ tôi sẽ thử ở đây. Tôi dường như đã đạt được nhiều sự giúp đỡ từ những người tốt ở Maxima.Lỗi SBCL: "liên kết chồng cạn kiệt" khi chạy Maxima trên máy Linux

Tôi chạy Maxima với SBCL và luôn gặp lỗi;

INFO: Binding stack guard page unprotected 
Binding stack guard page temporarily disabled: proceed with caution 

Maxima encountered a Lisp error: 

Binding stack exhausted. 

PROCEED WITH CAUTION. 

Automatically continuing. 
To enable the Lisp debugger set *debugger-hook* to nil. 
INFO: Binding stack guard page reprotected 

Tôi đã sửa đổi các cuộc gọi đến Maxima (thực thi của nó) bằng cách thêm giá trị lớn hơn cho các kích thước không gian năng độngkiểm soát ngăn xếp kích thước, và tôi đã xem xét ./.../sbcl -help để biết bất kỳ ý tưởng nào về các đối số để thêm vào $ MAXIMA_LISP_OPTIONS trong tệp thực thi tối đa.

Ngoài ra, tôi thường làm điều này ngay trước khi tôi chạy nó (mặc dù tôi tưởng tượng chúng là không cần thiết vì hệ điều hành thông minh, cũng có thể là điều cuối cùng cần phải được fiddled với);

sudo fstrim -v/
echo 3 | sudo tee /proc/sys/vm/drop_caches 
echo 262144 | sudo tee /proc/sys/vm/max_map_count 

và sau một vài phép tính trong khi làm việc Maxima của tôi, tôi ném vào một vài

:lisp (sb-ext:gc :full t) 

với hy vọng tránh được lỗi này. Tôi không biết lisp rằng tốt và chắc chắn không hiểu tất cả có về thu gom rác thải.

Tính toán của tôi hơi tốn kém và đệ quy, mặc dù tôi đang sử dụng ghi nhớ trong tác phẩm Maxima. Máy tính của tôi được mô tả bởi inxi -b như,

System: Host: XXX-MacBookPro Kernel: 4.10.0-33-generic x86_64 (64 bit) Desktop: Cinnamon 3.4.6 
      Distro: Linux Mint 18.2 Sonya 
Machine: System: Apple (portable) product: MacBookPro11 3 v: 1.0 
      Mobo: Apple model: Mac-2BD1B313 v: MacBookPro11 3 
      Bios: Apple v: MBP112.88Z.0138.B25.1702171721 date: 02/17/2017 
CPU:  Quad core Intel Core i7-4980HQ (-HT-MCP-) speed/max: 1402/4000 MHz 
Graphics: Card: NVIDIA GK107M [GeForce GT 750M Mac Edition] 
      Display Server: X.Org 1.18.4 drivers: nvidia (unloaded: fbdev,vesa,nouveau) 
      Resolution: [email protected] 
      GLX Renderer: GeForce GT 750M/PCIe/SSE2 GLX Version: 4.5.0 NVIDIA 375.66 
Network: Card-1: Broadcom BCM4360 802.11ac Wireless Network Adapter driver: wl 
      Card-2: Broadcom NetXtreme BCM57762 Gigabit Ethernet PCIe driver: tg3 
Drives: HDD Total Size: 1000.6GB (17.5% used) 
Info:  Processes: 291 Uptime: 43 min Memory: 3366.6/15953.7MB Client: Shell (bash) inxi: 2.2.35 

và Maxima và SBCL của tôi được xây dựng từ GIT và khá mới ~ khoảng 2 tuần, và từ đầu và đã vượt qua tất cả các bài kiểm tra làm của họ. Ngoài ra trao đổi của tôi trông giống như;

[email protected] ~/ResearchWC $ cat /proc/swaps 
Filename    Type  Size Used Priority 
/70GiB.swap        file  73400316 0 -2 
/dev/sda7        partition 25564776 0 -1 

và tôi thường về cơ bản hết bộ nhớ và khoảng 20-30G để hoán đổi.

Thông thường nó dường như treo cuối cùng (sau khi nói 100 giờ, khi tôi thông báo htop ngừng hiển thị hoạt động nhất định và quạt không tăng lên) và tôi nghĩ rằng các lỗi cạn kiệt đôi khi được chôn trong đệ quy nhúng cuộc gọi. Tôi nhận được thông báo lỗi này ở trên vì tôi tránh gọi hàm ở cấp độ đệ quy mà tôi muốn và thay vào đó, hãy tạo chúng bằng tay tại thiết bị đầu cuối. E.G., thay vì chỉ gọi một cái gì đó như fib (10), tôi thay vì gọi là fib liên tục (1), fib (2), fib (3), trong đó mỗi giá trị trước đó đã được ghi nhớ.

Tôi có thời gian nhưng dường như không biết cách tối đa hóa trao đổi - xem htop Tôi chưa bao giờ thấy nó sử dụng nhiều hơn nói ~ 25%.

1.) Có ai biết tôi có thể làm gì khác với SBCL để tránh những lỗi này không?

2.) Một trình duyệt khác có tốt hơn để chạy trong các tình huống này hay không, ví dụ: ecl, cml, v.v ...?

Cảm ơn trước vì lời khuyên nào và tôi có thể cung cấp thêm chi tiết nếu cần.

CẬP NHẬT

Sau khi nâng tỉ số kích thước động không gian, kích thước ngăn xếp, và các ràng buộc ngăn xếp kích thước, tôi đã lên chống lại giới hạn đống thay cho chồng ràng buộc thời gian này khi nó bị rơi. Kèm theo là đầu ra của backtrace (Không chắc chắn những gì hai đăng ký pc và fp là ... - chương trình truy cập và con trỏ khung?). Tôi chạy này với dấu vết (cặn, taylor) cũng nhưng không bao giờ nhìn thấy bất cứ điều gì tanh ...

ldb> backtrace 
Backtrace: 
    0: SB-BIGNUM::MULTIPLY-BIGNUM-AND-FIXNUM, pc = 0x21cb1336, fp = 0x7ffff3943f18 
    1: SB-KERNEL::TWO-ARG-*, pc = 0x21cb00a7, fp = 0x7ffff3943f98 
    2: MAXIMA::CTIMES, pc = 0x21e076b4, fp = 0x7ffff3943fc0 
    3: MAXIMA::PCTIMES, pc = 0x21de5f4c, fp = 0x7ffff3943ff0 
    4: MAXIMA::PCTIMES1, pc = 0x21e78f1e, fp = 0x7ffff3944048 
    5: MAXIMA::PCTIMES, pc = 0x21de6033, fp = 0x7ffff3944078 
    6: MAXIMA::PCETIMES1, pc = 0x21fe0560, fp = 0x7ffff39440d8 
    7: MAXIMA::PTIMES1, pc = 0x21f457e5, fp = 0x7ffff3944148 
    8: MAXIMA::PTIMES, pc = 0x21db6561, fp = 0x7ffff3944180 
    9: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff39441b8 
    10: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff39441f0 
    11: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff3944228 
    12: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff3944260 
    13: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff3944298 
    14: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff39442d0 
    15: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff3944308 
    16: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff3944340 
    17: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff3944378 
    18: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff39443b0 
    19: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff39443e8 
    20: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff3944420 
    21: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff3944458 
    22: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff3944490 
    23: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff39444c8 
    24: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff3944500 
    25: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff3944538 
    26: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff3944570 
    27: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff39445a8 
    28: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff39445e0 
    29: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff3944618 
    30: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff3944650 
    31: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff3944688 
    32: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff39446c0 
    33: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff39446f8 
    34: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff3944730 
    35: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff3944768 
    36: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff39447a0 
    37: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff39447d8 
    38: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff3944810 
    39: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff3944848 
    40: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff3944880 
    41: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff39448b8 
    42: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff39448f0 
    43: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff3944928 
    44: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff3944960 
    45: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff3944998 
    46: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff39449d0 
    47: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff3944a08 
    48: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff3944a40 
    49: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff3944a78 
    50: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff3944ab0 
    51: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff3944ae8 
    52: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff3944b20 
    53: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff3944b58 
    54: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff3944b90 
    55: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff3944bc8 
    56: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff3944c00 
    57: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff3944c38 
    58: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff3944c70 
    59: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff3944ca8 
    60: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff3944ce0 
    61: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff3944d18 
    62: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff3944d50 
    63: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff3944d88 
    64: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff3944dc0 
    65: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff3944df8 
    66: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff3944e30 
    67: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff3944e68 
    68: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff3944ea0 
    69: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff3944ed8 
    70: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff3944f10 
    71: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff3944f48 
    72: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff3944f80 
    73: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff3944fb8 
    74: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff3944ff0 
    75: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff3945028 
    76: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff3945060 
    77: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff3945098 
    78: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff39450d0 
    79: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff3945108 
    80: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff3945140 
    81: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff3945178 
    82: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff39451b0 
    83: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff39451e8 
    84: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff3945220 
    85: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff3945258 
    86: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff3945290 
    87: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff39452c8 
    88: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff3945300 
    89: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff3945338 
    90: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff3945370 
    91: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff39453a8 
    92: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff39453e0 
    93: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff3945418 
    94: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff3945450 
    95: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff3945488 
    96: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff39454c0 
    97: MAXIMA::PSIMP, pc = 0x21dd0617, fp = 0x7ffff39454f8 
    98: MAXIMA::PALGSIMP, pc = 0x22166db7, fp = 0x7ffff3945530 
+1

Ngăn xếp và đống là hai thứ khác nhau. 'Binding stack exhausted' thường sẽ trỏ đến độ sâu đệ quy cao. Một đống/trao đổi lớn sẽ là do rò rỉ bộ nhớ hoặc GC không thể giải phóng tất cả bộ nhớ. Nơi tốt nhất để hỏi là danh sách gửi thư của SBCL. Một thực hiện thay thế sẽ là Clozure CL. –

+0

@RainerJoswig Có cách nào để xác định độ sâu ngăn xếp cuộc gọi tối đa trong Common Lisp không? hoặc nếu không thì cụ thể cho SBCL? Tôi dường như nhớ lại rằng có một hằng số cho biết chiều sâu ngăn xếp tối đa nhưng tìm kiếm trên web dường như không tìm thấy bất kỳ thứ gì như vậy. Có lẽ đó là một chút suy nghĩ mơ hồ về phía tôi. –

+0

Nơi duy nhất tôi thấy đề cập đến "độ sâu ngăn xếp cuộc gọi tối đa" là sử dụng trong lược tả, mục 15.2.4 & 15.2.5 tại http://sbcl.org/manual/index.html và mô tả về ràng buộc & bẻ khóa trong hướng dẫn nội bộ trong phần 8.2 tại http://sbcl.org/sbcl-internals/Binding-and-unbinding.html#Binding-and-unbinding. Nhanh hai câu hỏi (có thể những gì bạn @RobertDodier hỏi @RainerJoswig) là độ sâu ngăn xếp ràng buộc được kiểm soát bởi một số biến có thể sửa đổi và "kiểm soát kích thước ngăn xếp" có ảnh hưởng đến điều này không? Tôi đã thấy cài đặt #define trong validate.h BINDING_STACK_SIZE đến 1024 * 1024 ... Tôi có thể tăng không? – nate

Trả lời

4

Nguyên nhân phổ biến nhất của bind stack overflow là một hàm đệ quy mà tự gọi mình vô thời hạn (tức là một lỗi trong đệ quy). Nguyên nhân phổ biến thứ hai là một hàm đệ quy được lập trình đúng, nhưng tự gọi quá nhiều lần để thực hiện Lisp để xử lý nó.

Tôi quên giới hạn ngăn xếp là gì đối với SBCL - có thể là 8192 nhưng đó chỉ là phỏng đoán. Bạn có thể xác định nó bằng thử nghiệm (nếu không bằng cách đọc tài liệu SBCL).

Trong cả hai trường hợp, bạn có thể cố gắng tìm ra những chức năng hoặc chức năng đang gây rắc rối qua

trace (mymaximafun1, mymaximafun2, ...); 

cho các chức năng Maxima và/hoặc

:lisp (trace mylispfun1 mylispfun2 ...) 

cho các chức năng Lisp.

Về vấn đề thứ hai, bạn có thể cố gắng tránh các cuộc xâm nhập sâu bằng cách làm lại các hàm đệ quy làm lặp lại.

Bạn đã đề cập rằng bạn có các phép tính dài hạn. Một chiến lược để giảm bớt ảnh hưởng của tai nạn là để gọi save chức năng để lưu trạng thái chương trình tất cả bây giờ và sau đó, ví dụ:

save ("mycheckpointfile.lisp", all); 

Lưu ý rằng save mất rất nhiều tùy chọn, như vậy có lẽ hãy xem tài liệu qua số ? save.

Bạn có thể tự động tạo tên tệp thông qua một số công thức như file_name : printf(false, "mycheckpointfile~d.lisp", 1000 + random(9000)) tạo số ngẫu nhiên gồm 4 chữ số và dán số đó vào tên tệp. Tất nhiên có rất nhiều công thức nấu ăn như vậy.

+0

Cảm ơn, dấu vết của bạn đề nghị đã không dẫn đến bất kỳ lỗi rõ ràng, nhưng vẫn săn ... – nate

+1

Bạn có thể có thể để có được một stack trace - nếu chương trình đi vào một debugger nhắc SBCL, hãy thử ': backtrace'. Tôi không biết điều đó có hiệu quả hay không. –

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