2017-10-09 3 views
6

나는이 질문을 할 수있는 곳이 많다는 것을 알고 있지만 여기에서 시도 할 것이라고 생각했습니다. 나는 이미 Maxima의 선량한 사람들에게서 가능한 한 많은 도움을 얻었습니다.SBCL 오류 : Linux 컴퓨터에서 Maxima를 실행할 때 "binding stack exhausted"

Maxima를 SBCL로 실행하고 지속적으로 오류가 발생합니다.

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 

는 I는 동적 공간 크기제어 스택 크기 대해 더 큰 값을 가산함으로써 맥시마 (그것의 실행)에 대한 호출을 수정 한, 난 ./.../sbcl 살펴본 -maxx 실행 파일에 $ MAXIMA_LISP_OPTIONS에 추가 할 인수에 대한 아이디어는을 참조하십시오.

또한 일반적으로 실행하기 전에이 작업을 수행합니다 (OS가 똑똑하기 때문에 불필요하다고 생각 하긴하지만, 마지막 작업은 꼭 필요합니다).

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

내 맥시마 작업을하는 동안 몇 가지 계산 후

, 나는이 오류를 피할 수있는 희망

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

의 몇 던져. 나는 lisp을 잘 모르고 확실히 가비지 콜렉션에 관한 모든 것을 이해하지 못한다.

맥시마 작업에서 메모를 사용하고 있지만 계산이 다소 집중적이고 재귀 적입니다. 내 컴퓨터, inxi 등 -b에 의해

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 

을 설명 내 맥시마와 SBCL은 GIT에서 구축하고 ~ 약 2 주, 머리에서 아주 새로운 및 모든 메이크업 테스트를 통과했다. 또한 내 스왑은 다음과 같습니다.

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

그리고 나는 종종 메모리가 부족하고 20-30G 정도가 스왑입니다. (나는 htop 특정 활동을 보여주는 중단 통보로, 이후 100 시간 말하는 팬은 오르지 않고 아래)

는 일반적으로 결국 걸어 것 같다 내가 고갈 오류가 가끔 포함 된 순환에 묻혀 있다고 생각 전화. 내가 원하는 재귀 레벨에서 함수를 호출하는 것을 피하고 대신 터미널에서 "손으로"그들을 빌드 했으므로 위의 오류 메시지가 나타납니다. E.G.는 fib (10)과 같은 함수를 호출하는 대신 fib (1), fib (2), fib (3)을 연속적으로 호출하여 각 이전 값을 메모했습니다.

시간이 있지만 내 스왑을 극대화하는 방법을 모르는 것 같습니다. htop 나는 ~ 25 % 이상 사용하는 것을 본 적이 없습니다.

1.) 누구든지 내가이 오류를 피하기 위해 SBCL로 무엇을 할 수 있는지 알고 있습니까?

2.) 이러한 상황에서 다른 isp을 실행하는 것이 더 좋을까요? ecl, cml 등?

미리 조언 해 주셔서 감사 드리며 필요한 경우 자세한 내용을 제공해 드리겠습니다.

UPDATE

동적 공간 크기, 스택 크기 및 바인딩 스택 크기 흐름이 완만 후, 나는 최대 힙 제한 대신 바인딩 스택은 추락이 시간에 대한이었다. 첨부 된 백 트레이스 출력 (두 개의 레지스터 pc와 fp가 ... - 프로그램 카운터와 프레임 포인터가 무엇인지 확실하지 않음). 나는

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

스택과 힙은 서로 다른 두 가지입니다. 'Binding stack exhausted'는 대개 ​​높은 재귀 깊이를 나타냅니다. 큰 힙/스왑은 메모리 유출 또는 모든 메모리를 확보 할 수없는 GC로 인해 발생합니다. 가장 좋은 곳은 SBCL 메일 링리스트입니다. 대안 구현은 Clozure CL입니다. –

+0

@RainerJoswig Common Lisp에서 최대 호출 스택 깊이를 결정하는 방법이 있습니까? 그렇지 않다면 SBCL을 위해 구체적으로? 최대 스택 깊이를 알려주는 상수가 있지만 웹 검색은 그러한 것을 찾지 못하는 것임을 상기하는 것 같습니다. 아마도 그것은 내 생각에 약간의 희망적인 생각 일 것입니다. –

+0

"최대 호출 스택 깊이"에 대한 언급이있는 유일한 곳은 http://sbcl.org/manual/index.html에서 15.2.4 절 및 15.2.5 절의 프로파일 링 및 바인딩 및 바인딩 해제에 대한 설명에 나와 있습니다. 섹션 8.2의 내부 매뉴얼 (http://sbcl.org/sbcl-internals/Binding-and-unbinding.html#Binding-and-unbinding). 빠른 두 질문 (어쩌면 @RobertDodier가 @RainerJoswig에게 물어 본 것)은 수정 가능한 변수에 의해 제어되는 바인딩 스택 깊이이며 "스택 크기 제어"가 이에 영향을 미칩니 까? validate.h에서 BINDING_STACK_SIZE를 1024 * 1024로 설정하는 #define을 보았습니다 ... 늘릴 수 있습니까? – nate

답변

4

바인드 스택 오버 플로우의 가장 일반적인 원인은 재귀에서 (즉, 버그 무기한 자신을 호출하는 재귀 함수입니다 ...뿐만 아니라 추적 (잔류 물, 테일러)와이를 실행하지만, 비린내 아무것도 본 적이). 두 번째로 가장 일반적인 원인은 올바르게 프로그래밍 된 재귀 함수이지만, Lisp 구현이이를 처리 할 수 ​​있도록 너무 많이 호출합니다.

스택 제한이 SBCL에 대한 것임을 잊어 버렸습니다. 8192 일지 모르지만 그것은 단지 추측입니다. 당신은 아마도 그것을 실험으로 결정할 수 있습니다 (SBCL 문서를 읽지 않은 경우). 당신이 문제의 원인이되는 기능이나 기능을 파악하려고 할 수 있습니다 경우

리스프 기능
trace (mymaximafun1, mymaximafun2, ...); 
맥시마 기능을위한

및/또는

:lisp (trace mylispfun1 mylispfun2 ...) 

를 통해.

두 번째 문제에 대해서는 재귀 함수를 반복으로 재 작업하여 심도있는 재귀를 피할 수 있습니다.

장기간 계산이 있다고 말씀하셨습니다. 충돌의 영향을 완화하기위한 전략은 모든 이제 다음 프로그램 상태를 저장하는 save 함수를 호출하는 것입니다, 예를 들면 : save 그래서 어쩌면 문서를 살펴 옵션이 많이 걸립니다

save ("mycheckpointfile.lisp", all); 

하는 것으로

? save을 통해

file_name : printf(false, "mycheckpointfile~d.lisp", 1000 + random(9000))과 같이 임의의 4 자리 숫자를 생성하여 파일 이름에 붙여 넣는 것과 같은 일부 제조법을 통해 자동으로 파일 이름을 생성 할 수 있습니다. 물론 많은 조리법이 있습니다.

+0

감사합니다. 추적 제안을 통해 명백한 오류는 발생하지 않지만 계속해서 찾아 볼 수 있습니다 ... – nate

+1

스택 추적을 얻을 수 있습니다 - 프로그램이 SBCL 디버거 프롬프트로 이동하면': backtrace'를 시도하십시오. 그게 효과가 있을지 모르겠다. –

관련 문제