2011-08-21 124 views
2

我是一個lisp noob嘗試使用sbcl v1.0.50學習lisp。Lisp IO問題

我正在寫一個簡單的記錄器和運行到一個內存故障,我不明白,但似乎與我如何編譯我的 腳本有關。我已經熬它歸結爲以下幾點:

=== logger.lisp ===

(defparameter *log-stream* (open "/tmp/global-log" 
         :direction :output 
         :if-does-not-exist :create 
         :if-exists :append)) 

=== main.lisp ===

(load "logger.lisp") 

(defun main() 
    (format *log-stream* "Hello world~%")) 

== compile.lisp ==

#! /usr/bin/sbcl --script 
(load "main.lisp") 
(save-lisp-and-die "program" :toplevel #'main :executable t) 

當我編譯並運行該程序崩潰:

> ./compile.lisp 
[undoing binding stack and other enclosing state... done] 
[saving current Lisp image into foo: 
writing 6352 bytes from the read-only space at 0x20000000 
writing 4064 bytes from the static space at 0x20100000 
writing 43057152 bytes from the dynamic space at 0x1000000000 
> ./program 
CORRUPTION WARNING in SBCL pid 21860(tid 140737353914112): 
Memory fault at f6977000 (pc=0x1000036365, sp=0x7ffff6b7f8d0) 
The integrity of this image is possibly compromised. 
Continuing with fingers crossed. 
unhandled SB-SYS:MEMORY-FAULT-ERROR in thread #<SB-THREAD:THREAD 
               "initial thread" RUNNING 
               {10029118D1}>: 
    Unhandled memory fault at #x7FFFF6977000. 

0: (SB-DEBUG::MAP-BACKTRACE 
    #<CLOSURE (LAMBDA #) {100291A3C9}> 
    :START 
    0 
    :COUNT 
    128) 
1: (BACKTRACE 128 #<SYNONYM-STREAM :SYMBOL SB-SYS:*STDERR* {100001CEB1}>) 
2: (SB-DEBUG::DEBUGGER-DISABLED-HOOK 
    #<SB-SYS:MEMORY-FAULT-ERROR {10029180E1}> 
    #<unavailable argument>) 
3: (SB-DEBUG::RUN-HOOK 
    *INVOKE-DEBUGGER-HOOK* 
    #<SB-SYS:MEMORY-FAULT-ERROR {10029180E1}>) 
4: (INVOKE-DEBUGGER #<SB-SYS:MEMORY-FAULT-ERROR {10029180E1}>) 
5: (ERROR SB-SYS:MEMORY-FAULT-ERROR :ADDRESS 140737330507776) 
6: (SB-SYS:MEMORY-FAULT-ERROR) 
7: ("foreign function: #x4174A0") 
8: ("foreign function: #x417580") 
9: (SB-IMPL::OUTPUT-BYTES/UTF-8 
    #<SB-SYS:FD-STREAM for "file /tmp/global-log" {10001B8A81}> 
    "AAAA" 
    NIL 
    0 
    4) 
10: (SB-IMPL::FD-SOUT 
    #<SB-SYS:FD-STREAM for "file /tmp/global-log" {10001B8A81}> 
    "AAAA" 
    0 
    4) 
11: (SB-IMPL::%WRITE-STRING 
    "AAAA" 
    #<SB-SYS:FD-STREAM for "file /tmp/global-log" {10001B8A81}> 
    0 
    NIL) 
12: ((LAMBDA (STREAM &OPTIONAL &REST SB-FORMAT::ARGS)) 
    #<SB-SYS:FD-STREAM for "file /tmp/global-log" {10001B8A81}>) 
13: (FORMAT 
    #<SB-SYS:FD-STREAM for "file /tmp/global-log" {10001B8A81}> 
    #<FUNCTION (LAMBDA #) {100002F6C9}>) 
14: ((FLET #:WITHOUT-INTERRUPTS-BODY-[RESTART-LISP]30)) 
15: ((LABELS SB-IMPL::RESTART-LISP)) 

unhandled condition in --disable-debugger mode, quitting 

我試了一會兒才明白髮生了什麼,但嗯。幫助 將不勝感激!

Anders

回答

9

您打開一個流,然後轉儲圖像。

然後您開始轉儲的圖像並嘗試寫入流。

您不能期望流在程序運行之間保持打開狀態,或者在啓動圖像時自動打開。

如果您啓動圖像,請打開該流,然後寫入該圖像。

另請參閱宏WITH-OPEN-FILE。

您可能還想在SBCL郵件列表中討論此問題。 SBCL應該提供更好的錯誤報告。

一般來說,您需要了解傾倒圖像的工作方式以及限制條件。通常,一個不能:

  • 轉儲打開的流
  • 保持網絡連接打開的狀態
  • 經常打開窗戶

更多...

+1

啊,當然!我必須習慣這種傾倒圖像 以獲得可執行文件。謝謝。 – aklt