通常用nim寫程序基本都用echo, repr等命令簡單調試, 相信你們也會須要高級調試的時候, 因此在這裏介紹如何使用lldb或gdb調試nim程序.c++
首先輸入代碼保存test.nim.bash
#test.nim echo "Hello World" var x = 10 echo "Value of x: ", x
而後打開終端..net
$nim c --debugger:native test.nim #用nim編譯出帶調試內容的程序 $lldb ./test #或者gdb ./test (lldb)b test.nim:2 (lldb)run #運行後會斷到 x = 10 這行 (lldb)n #運行到下一行 echo ... (lldb)p x_95008 #查看x的值,爲何是x_95008等會再說 $0 = 10 (lldb)p x_95008 = 666 #改變x的值 $1 = 666 (lldb)c Value of x: 666 (lldb)q #y 退出調試器
代碼裏的變量明明是x爲何變成x_95008了呢? 並且這個數字我是怎麼知道的?debug
這個疑問首先要了解nim的編譯過程是怎樣, nim編譯文件首先會把nim代碼轉成c/c++/objc代碼放到同目錄的nimcache目錄裏, 而後再交給相關的編譯器編譯, 因此這個變量真實的名字就是在./nimcache/test.c這個文件裏.調試
//./nimcache/test.c #line 1 "/Users/xxx/nimcache/test.nim" nimln(1, "test.nim"); printf("%s\012", ((NimStringDesc*) &TMP140)? (((NimStringDesc*) &TMP140))->data:"nil"); #line 2 "/Users/xxx/nimcache/test.nim" nimln(2, "test.nim"); x_95008 = ((NI) 10); #line 3 "/Users/xxx/nimcache/test.nim" nimln(3, "test.nim"); #line 3 "/Users/xxx/nimcache/test.nim" LOC1 = 0; LOC1 = nimIntToStr(x_95008); printf("%s%s\012", ((NimStringDesc*) &TMP141)? (((NimStringDesc*) &TMP141))->data:"nil", LOC1? (LOC1)->data:"nil"); popFrame();}
這些內容都在test.c文件最下面, line其實就是test.nim文件上的代碼行, 相同的x_95008就是那個x的真實變量名了, 更多的操做方法你們能夠了解lldb/gdb的使用.code
參考資料:Debugging nimblog