代码之家  ›  专栏  ›  技术社区  ›  wvxvw

Bison+Flex segfault无回溯

  •  -1
  • wvxvw  · 技术社区  · 8 年前

    我正在试着调试Bison+Flex生成的代码(真是太好了!)。它将故障分割得非常严重,甚至没有可用的堆栈信息 gdb . 有没有办法让这种组合生成更易于调试的代码?

    请注意,我正在尝试编译一个可重入的lexer和parser(这本身就是一个巨大的难题)。

    下面是尝试使用 yyparse :

    int main(int argc, char** argv) {
        int res;
        if (argc == 2) {
            yyscan_t yyscanner;
            res = yylex_init(&yyscanner);
            if (res != 0) {
               fprintf(stderr, "Couldn't initialize scanner\n");
               return res;
            }
            FILE* h = fopen(argv[1], "rb");
    
            if (h == NULL) {
                fprintf(stderr, "Couldn't open: %s\n", argv[1]);
                return errno;
            }
            yyset_in(h, yyscanner);
            fprintf(stderr, "Scanner set\n");
            res = yyparse(&yyscanner);
            fprintf(stderr, "Parsed\n");
            yylex_destroy(&yyscanner);
            return res;
        }
        if (argc > 2) {
            fprintf(stderr, "Wrong number of arguments\n");
        }
        print_usage();
        return 1;
    }
    

    尝试运行此操作将提供:

    (gdb) r
    Starting program: /.../program 
    [Inferior 1 (process 3292) exited with code 01]
    

    注2:我通过了 -d 到 flex 和 -t 到 bison .


    在重新整理代码之后,我能够得到回溯。但是看来是超车 -t型 没有任何影响 %debug 中的指令 *.y 文件获取跟踪的唯一方法是设置 yydebug = 1 在代码中。

    1 回复  |  直到 8 年前
        1
  •  2
  •   Community Mohan Dere    6 年前

    通过传递 yyscanner 而不是它的价值 yyparse . 一旦堆栈以这种方式被覆盖,即使gdb也无法提供准确的回溯。

    这个 -d 和 %debug 指令使bison发出执行调试跟踪所需的代码。(这会使解析器代码稍大一些,速度稍慢一些,因此默认情况下不会启用它。)这是跟踪工作所必需的,但您仍然必须通过设置 yydebug 设置为非零值。

    这一点在 Bison manual section on tracing :(增加强调)

    8.4.1启用跟踪

    有几种方法可以 启用编译 跟踪设施数量

    稍晚些时候:

    使用跟踪工具编译程序后,请求跟踪的方法是在变量yydebug中存储一个非零值。您可以通过让C代码执行此操作(可能是在main中),也可以使用C调试器更改值。

    除非你是在资源极度紧张的环境中工作,否则我建议你 总是 使用 -t 选项,就像野牛作者一样:

    我们建议您始终启用跟踪选项,以便始终可以进行调试。