C 代码在使用 gdb 运行时可以工作,但通常不能工作

问题描述 投票:0回答:1

我的代码仅在使用 gdb 运行时才有效: gdb ./MyCode 跑

如果我只是输入: ./我的代码

这是我的代码失败的部分:

bool packageBuildFileDownload(char* receiver, char* finished, char* file_name, char* payload, char** json_string, size_t json_string_size) {
    cJSON* json = packageCreateJson();
    if (!json) return false;
        
    typedef struct PackageAttribute {
        char
            *name, 
            *value;
    } PackageAttribute;
    
    PackageAttribute attributes[] = {
        {
            .name = "type", 
            .value = "filedownload"
        }, 
        {
            .name = "receiver", 
            .value = receiver
        }, 
        {
            .name = "file_name", 
            .value = file_name
        }, 
        {
            .name = "finished", 
            .value = finished
        }, 
        {
            .name = "payload", 
            .value = payload
        }           
    };
    int attributes_size = sizeof(attributes) / sizeof(attributes[0]);
    
    for (int i = 0; i < attributes_size; i++) {
        if (!cJSON_AddStringToObject(json, attributes[i].name, attributes[i].value)) {
            cJSON_Delete(json);
            return false;
        }
    }

    if (!cJSON_PrintPreallocated(json, *json_string, json_string_size, false)) {
        // cJSON_PrintPreallocated returns failour 
        cJSON_Delete(json);
        return false;
    }
    
    cJSON_Delete(json);
    return true;
}

static bool filedownloadrequestSendResponse(Socket* socket, uint8_t* file_buffer, size_t file_buffer_size, char* receiver, char* finished, char* file_name) {
    char* b64_encode_buffer;
    base64Encode(file_buffer, file_buffer_size, &b64_encode_buffer);

    char* json_string = malloc(RESPONSE_PACKAGE_BUFFER_SIZE);
    if (!packageBuildFileDownload(receiver, finished, file_name, b64_encode_buffer, &json_string, strlen(json_string))) {
        free(json_string);
        return false;
    }
    
    free(b64_encode_buffer);
    
    CURLcode result = sendWs(socket->curl, json_string);
    free(json_string);
    if (result != CURLE_OK) {
        fprintf(stderr, "sendWs() failed: %s\n", curl_easy_strerror(result));
        return false;
    }
    
    return true;
}

我的 packageBuildFileDownload() 函数返回 false,因为 cJSON_PrintPrealulated 失败(cJSON_PrintPrealulated 是 cJSON 库的一部分)。仅当我由于某种原因不使用 gdb 时才会发生这种情况。

如果您需要更多代码,请告诉我:)

c windows debugging gdb cjson
1个回答
0
投票

我的代码仅在使用 gdb 运行时才有效:

GDB 默认情况下禁用 ASLR。如果您重新启用 ASLR,您的代码可能会在 GDB 下停止工作:

gdb ./MyCode run
(gdb) set disable-randomization off
(gdb) run

如果启用 ASLR 导致程序失败,则极有可能是由于使用未初始化的内存而失败。

正如 Stanislav Volodarskiy 评论的那样,这绝对是一个错误(而且正是读取未初始化内存的错误):

char* json_string = malloc(RESPONSE_PACKAGE_BUFFER_SIZE);
if (!packageBuildFileDownload(..., &json_string, strlen(json_string))) {

要修复该错误,请执行以下操作:

char* json_string = malloc(RESPONSE_PACKAGE_BUFFER_SIZE);
if (!packageBuildFileDownload(..., &json_string, RESPONSE_PACKAGE_BUFFER_SIZE)) {
© www.soinside.com 2019 - 2024. All rights reserved.