0

私には2つの機能があります。

struct logger_message vget_log_msg(enum LogStatus log_status, const char* format, va_list args) {    
    struct logger_message log_msg;
    log_msg.status = log_status;
    log_msg.timestamp = get_current_timestamp();

    memset(log_msg.message_buffer, 0, MESSAGE_SIZE);
    if(format){    
        vsprintf(log_msg.message_buffer, format, args);
    }
    return log_msg;
}

int send_log_message_to_mqueue(mqd_t mqd, enum LogStatus log_status, const char* format, ...) {
    struct logger_message msg;
    va_list argp;
    va_start(argp, format); 
    msg = vget_log_msg(log_status, format, argp);
    va_end(argp);
    int res; 
    res = send_message_to_mqueue(mqd, (char *)&msg, sizeof(msg));
    return res;
}

したがって、次の行で vget_log_msg から戻るときに、「Segmentation Fault(Core dumped)」というエラーが表示されます。

msg = vget_log_msg(log_status, format, argp);

編集:多分この情報は役に立つかもしれません

struct logger_message{
    enum LogStatus status;
    time_t timestamp;
    char message_buffer[MESSAGE_SIZE];    
};

このエラーが発生する理由を知っている人はいますか? それを修正する方法は?

4

2 に答える 2

3

MESSAGE_SIZE とは何ですか? それはどのくらいの大きさですか?サイズを小さくして確認するか、構造全体ではなくポインターを使用して返すことができますか。

于 2013-01-29T07:44:01.613 に答える
0

vget_log_msgを含むファイルでプロトタイプを実際に宣言せずに使用したと思いますsend_log_message_to_mqueue。たとえば、 を定義するヘッダー ファイルをインクルードしないvget_log_msg、または両方が同じファイルにある場合は、vget_log_msg前にを定義しないなどsend_log_message_to_mqueueです。

その場合、コンパイラは が をvget_log_msg返すと想定しint、構造体を返す関数に対して正しい呼び出し規約を使用しません。このような構造体は、スタックの側で返された構造体用のバッファーを呼び出し元が割り当て、そのバッファーへのポインターを暗黙的なパラメーターとして呼び出し先関数に渡すことによって返されます。間違った呼び出し規則を使用すると、その暗黙的なポインターが欠落して間違ったものになり、返される関数が返された構造体を無効な場所に書き込むことになります。

または、異なるバージョンの を使用するように作成することもできstruct logger_messageます。たとえば、異なるヘッダー ファイルを別の方法で宣言するなどです。

于 2013-01-29T07:30:42.860 に答える