c++ __static_initialization_and_destrition_0(int,int)()分段错误

bxfogqkk  于 2023-05-30  发布在  其他
关注(0)|答案(1)|浏览(138)

我知道有人问过类似的问题,但我无法根据我所看到的来确定为什么我会得到这个错误。
这是回溯:

SymbolStack的定义(在Symbols.h中):

#ifndef HW3_SYMBOLS_H
#define HW3_SYMBOLS_H

#include <string>
#include <vector>
#include <iostream>
#include "shared_def.h"

using std::vector; using std::string;
extern int yylineno;

...

class SymbolStack {
public:
    vector<int> pos_stack = vector<int>();
    vector<SymbolTable*> scope_stack = vector<SymbolTable*>();
public:
    SymbolStack();
    ErrorType is_func_valid(const string& func_name, const string& retype, vector<string>* params_types, bool is_override);
    void push(bool is_while, Types retType = T_NONE);
    void pop();
    SymbolTable* get_curr_scope();
    void symbol_document(const string& symbol_name,const string& symbol_type, bool is_func = false,
                         bool is_over = false, vector<string>* func_params_types = nullptr); // add new symbol to the stack
    void func_param_document(const string& symbol_name, const string& symbol_type, int pos); // add new function to the stack
    bool symbol_exists(const string& symbol_name); // does a symbol exists?
    SymbolEntry* get_symbol(const string& symbol_name);
    SymbolEntry* get_func_symbol(const string& func_name, const string& retype, vector<string>* params_types, int* count); // if retype == "" error if count >= 2
   // bool function_exists(const string& name, vector<string>* params_types = nullptr);
    bool check_program();
    ~SymbolStack();
};

...

#endif //HW3_SYMBOLS_H

Types是在shared_def. h中定义的枚举。Symbolics.cpp中的方法:

SymbolStack::SymbolStack(){
    pos_stack.push_back(0); // init to offset = zero
    this->push(false, T_VOID);
    vector<string> print_param = vector<string>();
    vector<string> printi_param = vector<string>();
    print_param.push_back("string");
    printi_param.push_back("int");
    this->symbol_document("print", "void", FUNC, &print_param);
    this->symbol_document("printi", "void", FUNC, &printi_param);
}
void SymbolStack::push(bool is_while, Types retType){
    retType = retType == T_NONE? scope_stack.back()->ret_type : retType;
    SymbolTable* first_scope = new SymbolTable(pos_stack.back(), is_while, retType);
    pos_stack.push_back(pos_stack.back());
    scope_stack.push_back(first_scope);
}

SymbolStack的构造函数在parser.ypp中被调用:

%{
    #include <stdio.h>
    #include <iostream>
    #include "types.h"
    #include "hw3_output.hpp"
    extern int yylineno;
    extern int yylex();
    int yyerror(const char* message);
    extern SymbolStack tables;
%}

definitions...
%%
Rule...
%%

tables = SymbolStack();
int main(){
        int res = yyparse();
        bool is_valid_program = tables.check_program();
        if(!is_valid_program){
            output::errorMainMissing();
            exit(0);
        }
        tables.pop();
        return res;
}
int yyerror(const char * message){
    output::errorSyn(yylineno);
    exit(0);
}

我没有设法使用gdb调试它,因为它甚至在调用main之前就发生了。如果我删除这行“this->push(false,T_VOID);”的构造。
任何帮助将不胜感激。
编辑:在我使用的任何源文件中没有任何定义为静态的。

62lalag4

62lalag41#

我没有设法使用gdb调试它,因为它甚至在调用main之前就发生了。

  1. GDB * 完全 * 能够调试在main之前发生的崩溃。
    1.您 * 显示 * GDB输出(但您的代码是在没有调试的情况下构建的(-g))。
    在我使用的任何源文件中没有任何东西被定义为静态的。
    你有一个 globaltables变量。崩溃很可能发生在该变量的初始化期间。
    如果没有http://stackoverflow.com/help/mcve,我们就无法提供太多帮助。
    但是您应该能够通过使用-g重新构建并在SymbolStack::SymbolStack上设置断点来调试它。
    我唯一能想到的是,如果T_VOID == T_NONE,那么这行:
retType = retType == T_NONE? scope_stack.back()->ret_type : retType;

将使用不存在的scope_stack.back()scope_stack仍然为空),这应该会崩溃。
P.S.要理解崩溃,检查崩溃指令((gdb) x/i $pc)和寄存器值((gdb) info regs)通常很有帮助。

相关问题