2011-06-30 95 views
-1

我已經使用Lemon Parser生成了解析器代碼。我無法調試生成的代碼。控件顯示除當前執行的語句之外的其他一些源代碼。斷點被取代。我嘗試了gdb和Visual C++。兩者都有同樣的問題。請告訴我調試它的方法。調試解析器生成的代碼

+0

你的意思是gdb?.. – ascanio

+0

你是否用調試信息編譯? – crashmstr

+0

是的,我做了..我有一個包含主程序的文件。這是很好的調試。踏入和踩下以及斷點都可以工作。代碼進入解析器生成的代碼的那一刻,控制(遊標)將指向其他地方,執行將發生在其他地方。現在我正在用printfs進行調試。它非常乏味的工作。有時我把BP作爲函數,然後我看到代碼流的調用堆棧。 – Bharadwaj

回答

0

如果您將它們構建爲lib/dll,請檢查優化,調試信息選項。

1

以下是經過認證的WAG(野驢猜猜):

我建議在看所有的的正在使用的解析器生成,看看是否有其中的任何逃脫換行符。如果有,請嘗試刪除它們(通過將這些行連接在一起),然後重新編譯該文件。然後在調試器中查看代碼 - 突然間可能會回到他們應該在的位置。

Backstory:早在80年代,我開發並銷售了一款名爲CDB的調試器。當我將它移植到名稱爲U * NX的任何事物中時,我都非常熟悉各種編譯器的特性以及它們在特定情況下如何發出調試信息。

一個普遍存在的問題與已經逃脫換行的宏有關。例如。

#define foo(bar) bar + \ 
    snort + something_else 

x = foo(5); 
y = 2; 

如果y = 2;行號已經如圖5所示,許多符號表將結束其顯示爲6,並在其後每線將是關閉的情況的一個。而且每一次使用這樣的宏都會使行號越離越遠。

2

比方說,你輸入文件名爲mylexer.y在這種情況下,檸檬會產生myparser.c和myparser.h

裏面myparser.c你會看到線,如該

#line 1 "myparser.y" 

的這些是line directives。它們適用於將語法錯誤追溯回用於生成代碼的文件。它們不適合調試。

使用-l選項禁止它們調用Lemon

lemon -l myparser.y 

要查看文檔中未提及的其他選項,請使用 - ?

lemon -?