如何使用lldb/gdb調試Nim程序

通常用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

相關文章
相關標籤/搜索