2011-06-30 62 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 -?