0

我有两个功能。

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_msgbefore send_log_message_to_mqueue

在这种情况下,编译器会假设vget_log_msg返回一个int而不是对返回结构的函数使用正确的调用约定。这样的结构由调用者返回,它在堆栈的一侧为返回的结构分配一个缓冲区,并将指向该缓冲区的指针作为隐式参数传递给被调用函数;那么,使用错误的调用约定将导致该隐式指针丢失并因此错误,然后返回函数将返回的结构写入无效位置。

或者,它们可以使用不同版本的struct logger_messageby,例如,包括以不同方式声明它的不同头文件。

于 2013-01-29T07:30:42.860 回答