使用valgrind时出现奇怪的错误?也许是虫子? 我正在开发一个C++程序,当我完成了,我想检查内存泄漏,但我发现了一个奇怪的错误与Valgnn: ==9106== Invalid free() / delete / delete[] / realloc() ==9106== at 0x4006C58: free (vg_replace_malloc.c:427) ==9106== by 0x42EB637D: free_mem (in /lib/libc-2.5.so) ==9106== by 0x42EB5F16: __libc_freeres (in /lib/libc-2.5.so) ==9106== by 0x4002451: _vgnU_freeres (vg_preloaded.c:61) ==9106== by 0x42E38EA3: _Exit (in /lib/libc-2.5.so) ==9106== by 0x42DC0DF3: (below main) (in /lib/libc-2.5.so) ==9106== Address 0x403f818 is not stack'd, malloc'd or (recently) free'd

使用valgrind时出现奇怪的错误?也许是虫子? 我正在开发一个C++程序,当我完成了,我想检查内存泄漏,但我发现了一个奇怪的错误与Valgnn: ==9106== Invalid free() / delete / delete[] / realloc() ==9106== at 0x4006C58: free (vg_replace_malloc.c:427) ==9106== by 0x42EB637D: free_mem (in /lib/libc-2.5.so) ==9106== by 0x42EB5F16: __libc_freeres (in /lib/libc-2.5.so) ==9106== by 0x4002451: _vgnU_freeres (vg_preloaded.c:61) ==9106== by 0x42E38EA3: _Exit (in /lib/libc-2.5.so) ==9106== by 0x42DC0DF3: (below main) (in /lib/libc-2.5.so) ==9106== Address 0x403f818 is not stack'd, malloc'd or (recently) free'd,c++,linux,profiling,valgrind,C++,Linux,Profiling,Valgrind,因为它没有告诉任何关于无效删除所在行号的信息,所以我不得不使用注释块的方法 令人惊讶的是,直到我注释了所有代码,错误仍然出现 我终于有了这个代码: int main(int argc, char** argv) { /* ... all other code */ return 0; } 这里发生了什么?流浪虫?那么,我可以安全地忽略这个错误吗 我以这种方式运行valgrind 3.7.0(在Linux下): 编辑: 这是全部代码: /* * File: main.cp

因为它没有告诉任何关于无效删除所在行号的信息,所以我不得不使用注释块的方法

令人惊讶的是,直到我注释了所有代码,错误仍然出现

我终于有了这个代码:

int main(int argc, char** argv) {
    /* ... all other code */
    return 0;
}
这里发生了什么?流浪虫?那么,我可以安全地忽略这个错误吗

我以这种方式运行valgrind 3.7.0(在Linux下):

编辑:

这是全部代码:

/* 
 * File:   main.cpp
 * Author: jstuardo
 *
 * Created on March 22, 2013, 7:32 PM
 */


#include <cstdlib>
#include <iostream>
/*
#include <string>
#include <map>

#include "Settings.h"
#include "FComm.h"
#include "Log.h"
#include "Helper.h"

using namespace std;

static string get_optional_parameter(std::map<string, string> parameters, string key) {
    if (parameters.count(key) == 0)
        return "";
    else
        return parameters[key];
}

static bool show_usage(std::string name) {
    std::cerr << "Uso: " << name << " OPCIONES\n\n"
            << "Las opciones posibles son:\n"
            << "\t--command COMANDO\tComando que se les envía a los equipos biométricos\n"
            << "\t--ip IP\t\t\tEspecifica la dirección IP de un equipo\n"
            << "\t--staff STAFF\t\tEspecifica el ID de un funcionario\n"
            << "\t--date_from FECHA\tEspecifica la fecha de inicio de una consulta a la base de datos\n"
            << "\t--date_to FECHA\t\tEspecifica la fecha de término de una consulta a la base de datos\n"
            << "\t--fingers DEDOS\t\tEspecifica los dedos de ambas manos para las cuales realizar una oepración\n"
            << "\t--verbose\t\tMuestra por consola la operación de la aplicación\n"
            << "\t--retries INTENTOS\t\tCantidad de intentos que debe realizar para la conexión en caso de error de comunicación\n"
            << "\t--delay RETARDO\t\tCantidad de milisegundos a esperar luego que se envía el comando\n"
            << "\t--thread\t\tEnvía los comandos a los equipos mediante threads\n"
            << "\t--source SOURCE \t\tEspecifica archivo existente en el equipo indicado por IP\n"
            << "\t--target TARGET \t\tEspecifica archivo a crear en el PC\n\n"
            << "Los comandos posibles son:\n"
            << "\tcheck\tVerifica la comunicación con el equipo dado por el parámetro --ip\n"
            << "\tbroadcast\tTransmite todos los archivos existentes en la carpeta \"" << FComm::SHARE_FOLDER << "\" a todos los equipos configurados, excepto al indicado por el parámeto --ip\n"
            << "\tset_time\tSincroniza la fecha y hora de todos los equipos configurados con la fecha y hora del PC\n"
            << "\tget_fingerprints\tObtiene los archivos de huellas desde el equipo indicado por el parámetro --ip del funcionario indicado por el parámetro --staff\n"
            << "\tdelete_fingerprints\tBorra las huellas de todos los equipos configurados. Las huellas se indican con el parámetro --fingers como sigue:    0:1:2:3:4:5:6:7:8:9 (para todos o algunos de los dedos\n"
            << "\tget_logs\tObtiene las marcaciones existentes en los equipos configurados (archivos wdjl y los almacena en la carpeta \"" << FComm::WDJL_FOLDER << "\")\n"
            << "\tprocess_logs\tProcesa todos los registros existentes en la carpeta \"" << FComm::WDJL_FOLDER << "\"\n"
            << "\tget_archives\tObtiene el archivo de funcionarios y los almacena en la carpeta \"" << FComm::SHARE_FOLDER << "\")\n"
            << "\tget_photos\tObtiene las fotos de las marcas que aún no tienen foto de todos los equipos configurados. Si se especifican fechas, se traen solo las fotos de las marcas de ese intervalo.\n"
            << "\tget_one_photo\tObtiene una única foto desde el equipo indicado por IP." << endl;

    return true;
}
*/

/*
 * 
 */
int main(int argc, char** argv) {
    std::cout << "all commented" << std::endl;
    return 0;
    /*
    bool verbose = false;
    bool multithread = false;
    int retries = 0;
    int delay = 0;
    std::string command;
    std::map<string, string> parameters;

    // Lee los parámetros de la línea de comandos
    for (int i = 1; i < argc; ++i) {
        if (string(argv[i]) == "--command") {
            if (i + 1 < argc)
                command = argv[++i];
        } else if (string(argv[i]) == "--ip") {
            if (i + 1 < argc)
                parameters["ip"] = argv[++i];
        } else if (string(argv[i]) == "--staff") {
            if (i + 1 < argc)
                parameters["staff"] = argv[++i];
        } else if (string(argv[i]) == "--date_from") {
            if (i + 1 < argc)
                parameters["date_from"] = argv[++i];
        } else if (string(argv[i]) == "--date_to") {
            if (i + 1 < argc)
                parameters["date_to"] = argv[++i];
        } else if (string(argv[i]) == "--fingers") {
            if (i + 1 < argc)
                parameters["fingers"] = argv[++i];
        } else if (string(argv[i]) == "--retries") {
            if (i + 1 < argc)
                retries = atoi(argv[++i]);
        } else if (string(argv[i]) == "--delay") {
            if (i + 1 < argc)
                delay = atoi(argv[++i]);
        } else if (string(argv[i]) == "--verbose") {
            verbose = true;
        } else if (string(argv[i]) == "--thread") {
            multithread = true;
        } else if (string(argv[i]) == "--source") {
            if (i + 1 < argc)
                parameters["source"] = argv[++i];
        } else if (string(argv[i]) == "--target") {
            if (i + 1 < argc)
                parameters["target"] = argv[++i];
        }
    }

    string executable = argv[0];
    executable = executable.substr(executable.find_last_of("/") + 1);

    bool salida = false;

    if (command == "")
        salida |= show_usage(executable);
    else if (command == "get_fingerprints" && (parameters.count("ip") == 0 || parameters.count("staff") == 0))
        salida |= show_usage(executable);
    else if (command == "delete_fingerprints" && parameters.count("fingers") == 0)
        salida |= show_usage(executable);
    else if (command == "get_bulk_photos" && parameters.count("ip") == 0)
        salida |= show_usage(executable);
    else if (command == "delete_bulk_photos" && parameters.count("ip") == 0)
        salida |= show_usage(executable);
    else if (command == "get_archives" && parameters.count("ip") == 0)
        salida |= show_usage(executable);    
    else if (command == "get_one_photo" && parameters.count("ip") == 0 && parameters.count("source") == 0 && parameters.count("target") == 0)
        salida |= show_usage(executable);

    if (command != "check" && command != "broadcast" && command != "set_time" && command != "get_fingerprints"
            && command != "delete_fingerprints" && command != "get_logs" && command != "process_logs"
            && command != "get_photos" && command != "get_bulk_photos" && command != "delete_bulk_photos" 
            && command != "get_one_photo" && command != "get_archives" && command != "decrypt_file")
        salida |= show_usage(executable);

    if (salida)
        return EXIT_FAILURE;

    Helper::CheckFolder(FComm::LOG_FOLDER);
    Log log(FComm::LOG_FOLDER + "common.log");

    if (verbose) {
        cout << "Ejecutando comando [" << command << "] con los parámetros:" << endl;
        for (map<string, string>::iterator it = parameters.begin(); it != parameters.end(); it++)
            cout << "\t" << it->first << " = " << it->second << endl;

        cout << "\tReintentos = " << retries << endl;

        cout << "\tRetardo = " << delay << " milisegundos" << endl;

        if (multithread) cout << "\tMultithread" << endl;
        else cout << "\tSecuencial" << endl;
    }

    log.Write("Ejecutando comando [" + command + "] con los parámetros:");
    for (map<string, string>::iterator it = parameters.begin(); it != parameters.end(); it++)
        log.Write("\t" + it->first + " = " + it->second);

    if (multithread) log.Write("\tMultithread");
    else log.Write("\tSecuencial");

    Settings settings;
    FComm fcomm(settings, retries, delay, verbose, multithread);

    bool exito = false;
    if (command == "check")
        exito = fcomm.Check(get_optional_parameter(parameters, "ip"));
    else if (command == "broadcast")
        exito = fcomm.Broadcast(get_optional_parameter(parameters, "ip"));
    else if (command == "set_time")
        exito = fcomm.SetTime(get_optional_parameter(parameters, "ip"));
    else if (command == "get_fingerprints")
        exito = fcomm.GetFingerprints(parameters["staff"], parameters["ip"]);
    else if (command == "delete_fingerprints")
        exito = fcomm.DeleteFingerprints(parameters["staff"], get_optional_parameter(parameters, "ip"), get_optional_parameter(parameters, "fingers"));
    else if (command == "get_logs")
        exito = fcomm.GetLogs(get_optional_parameter(parameters, "ip"));
    else if (command == "process_logs")
        exito = fcomm.ProcessLogs();
    else if (command == "get_archives")
        exito = fcomm.GetArchives(get_optional_parameter(parameters, "ip"));    
    else if (command == "get_photos")
        exito = fcomm.GetPhotos(get_optional_parameter(parameters, "ip"), get_optional_parameter(parameters, "date_from"), get_optional_parameter(parameters, "date_to"));
    else if (command == "get_one_photo")
        exito = fcomm.GetOnePhoto(parameters["ip"], parameters["source"], parameters["target"]);
    else if (command == "decrypt_file")
        exito = fcomm.DecryptFile(parameters["source"]);

    log.Write("Saliendo en forma exitosa.");

    return exito ? EXIT_SUCCESS : EXIT_FAILURE;
     */
}
提前感谢,


Jaime

由于_Exit位于堆栈跟踪上,因此对于某些静态或全局变量,可能在析构函数中发生了无效的free。它可能不在您的源文件中,但在您包含的类中,甚至在您正在链接的库中。

这是libc中已修复的错误。
您可以忽略此错误,或者使用valgrind选项
--运行libc freeres=no
来避免它

\uuuu libc\u freeres
在出口处被调用以释放资源; 错误在于,内存是从一个单独的池中分配的 正在返回到libc malloc/free区域

有关详细信息,请参阅
而且

我非常怀疑这是valgrind的一个bug。我在valgrind的精确版本上尝试了那个精确的代码,但没有出错。你确定所有东西都被注释掉了吗?什么是compile命令?如果使用调试符号编译,Valgrind应该告诉您行号。我添加了整个代码和整个Valgrind输出。请查收。此外,我使用的是调试版本。正如您在源代码中看到的,唯一包含的库是标准库,我链接的非标准库是PostgreSQL库(是函数,而不是类),但由于我对所有代码都进行了注释,因此没有调用外部函数。当做
/* 
 * File:   main.cpp
 * Author: jstuardo
 *
 * Created on March 22, 2013, 7:32 PM
 */


#include <cstdlib>
#include <iostream>
/*
#include <string>
#include <map>

#include "Settings.h"
#include "FComm.h"
#include "Log.h"
#include "Helper.h"

using namespace std;

static string get_optional_parameter(std::map<string, string> parameters, string key) {
    if (parameters.count(key) == 0)
        return "";
    else
        return parameters[key];
}

static bool show_usage(std::string name) {
    std::cerr << "Uso: " << name << " OPCIONES\n\n"
            << "Las opciones posibles son:\n"
            << "\t--command COMANDO\tComando que se les envía a los equipos biométricos\n"
            << "\t--ip IP\t\t\tEspecifica la dirección IP de un equipo\n"
            << "\t--staff STAFF\t\tEspecifica el ID de un funcionario\n"
            << "\t--date_from FECHA\tEspecifica la fecha de inicio de una consulta a la base de datos\n"
            << "\t--date_to FECHA\t\tEspecifica la fecha de término de una consulta a la base de datos\n"
            << "\t--fingers DEDOS\t\tEspecifica los dedos de ambas manos para las cuales realizar una oepración\n"
            << "\t--verbose\t\tMuestra por consola la operación de la aplicación\n"
            << "\t--retries INTENTOS\t\tCantidad de intentos que debe realizar para la conexión en caso de error de comunicación\n"
            << "\t--delay RETARDO\t\tCantidad de milisegundos a esperar luego que se envía el comando\n"
            << "\t--thread\t\tEnvía los comandos a los equipos mediante threads\n"
            << "\t--source SOURCE \t\tEspecifica archivo existente en el equipo indicado por IP\n"
            << "\t--target TARGET \t\tEspecifica archivo a crear en el PC\n\n"
            << "Los comandos posibles son:\n"
            << "\tcheck\tVerifica la comunicación con el equipo dado por el parámetro --ip\n"
            << "\tbroadcast\tTransmite todos los archivos existentes en la carpeta \"" << FComm::SHARE_FOLDER << "\" a todos los equipos configurados, excepto al indicado por el parámeto --ip\n"
            << "\tset_time\tSincroniza la fecha y hora de todos los equipos configurados con la fecha y hora del PC\n"
            << "\tget_fingerprints\tObtiene los archivos de huellas desde el equipo indicado por el parámetro --ip del funcionario indicado por el parámetro --staff\n"
            << "\tdelete_fingerprints\tBorra las huellas de todos los equipos configurados. Las huellas se indican con el parámetro --fingers como sigue:    0:1:2:3:4:5:6:7:8:9 (para todos o algunos de los dedos\n"
            << "\tget_logs\tObtiene las marcaciones existentes en los equipos configurados (archivos wdjl y los almacena en la carpeta \"" << FComm::WDJL_FOLDER << "\")\n"
            << "\tprocess_logs\tProcesa todos los registros existentes en la carpeta \"" << FComm::WDJL_FOLDER << "\"\n"
            << "\tget_archives\tObtiene el archivo de funcionarios y los almacena en la carpeta \"" << FComm::SHARE_FOLDER << "\")\n"
            << "\tget_photos\tObtiene las fotos de las marcas que aún no tienen foto de todos los equipos configurados. Si se especifican fechas, se traen solo las fotos de las marcas de ese intervalo.\n"
            << "\tget_one_photo\tObtiene una única foto desde el equipo indicado por IP." << endl;

    return true;
}
*/

/*
 * 
 */
int main(int argc, char** argv) {
    std::cout << "all commented" << std::endl;
    return 0;
    /*
    bool verbose = false;
    bool multithread = false;
    int retries = 0;
    int delay = 0;
    std::string command;
    std::map<string, string> parameters;

    // Lee los parámetros de la línea de comandos
    for (int i = 1; i < argc; ++i) {
        if (string(argv[i]) == "--command") {
            if (i + 1 < argc)
                command = argv[++i];
        } else if (string(argv[i]) == "--ip") {
            if (i + 1 < argc)
                parameters["ip"] = argv[++i];
        } else if (string(argv[i]) == "--staff") {
            if (i + 1 < argc)
                parameters["staff"] = argv[++i];
        } else if (string(argv[i]) == "--date_from") {
            if (i + 1 < argc)
                parameters["date_from"] = argv[++i];
        } else if (string(argv[i]) == "--date_to") {
            if (i + 1 < argc)
                parameters["date_to"] = argv[++i];
        } else if (string(argv[i]) == "--fingers") {
            if (i + 1 < argc)
                parameters["fingers"] = argv[++i];
        } else if (string(argv[i]) == "--retries") {
            if (i + 1 < argc)
                retries = atoi(argv[++i]);
        } else if (string(argv[i]) == "--delay") {
            if (i + 1 < argc)
                delay = atoi(argv[++i]);
        } else if (string(argv[i]) == "--verbose") {
            verbose = true;
        } else if (string(argv[i]) == "--thread") {
            multithread = true;
        } else if (string(argv[i]) == "--source") {
            if (i + 1 < argc)
                parameters["source"] = argv[++i];
        } else if (string(argv[i]) == "--target") {
            if (i + 1 < argc)
                parameters["target"] = argv[++i];
        }
    }

    string executable = argv[0];
    executable = executable.substr(executable.find_last_of("/") + 1);

    bool salida = false;

    if (command == "")
        salida |= show_usage(executable);
    else if (command == "get_fingerprints" && (parameters.count("ip") == 0 || parameters.count("staff") == 0))
        salida |= show_usage(executable);
    else if (command == "delete_fingerprints" && parameters.count("fingers") == 0)
        salida |= show_usage(executable);
    else if (command == "get_bulk_photos" && parameters.count("ip") == 0)
        salida |= show_usage(executable);
    else if (command == "delete_bulk_photos" && parameters.count("ip") == 0)
        salida |= show_usage(executable);
    else if (command == "get_archives" && parameters.count("ip") == 0)
        salida |= show_usage(executable);    
    else if (command == "get_one_photo" && parameters.count("ip") == 0 && parameters.count("source") == 0 && parameters.count("target") == 0)
        salida |= show_usage(executable);

    if (command != "check" && command != "broadcast" && command != "set_time" && command != "get_fingerprints"
            && command != "delete_fingerprints" && command != "get_logs" && command != "process_logs"
            && command != "get_photos" && command != "get_bulk_photos" && command != "delete_bulk_photos" 
            && command != "get_one_photo" && command != "get_archives" && command != "decrypt_file")
        salida |= show_usage(executable);

    if (salida)
        return EXIT_FAILURE;

    Helper::CheckFolder(FComm::LOG_FOLDER);
    Log log(FComm::LOG_FOLDER + "common.log");

    if (verbose) {
        cout << "Ejecutando comando [" << command << "] con los parámetros:" << endl;
        for (map<string, string>::iterator it = parameters.begin(); it != parameters.end(); it++)
            cout << "\t" << it->first << " = " << it->second << endl;

        cout << "\tReintentos = " << retries << endl;

        cout << "\tRetardo = " << delay << " milisegundos" << endl;

        if (multithread) cout << "\tMultithread" << endl;
        else cout << "\tSecuencial" << endl;
    }

    log.Write("Ejecutando comando [" + command + "] con los parámetros:");
    for (map<string, string>::iterator it = parameters.begin(); it != parameters.end(); it++)
        log.Write("\t" + it->first + " = " + it->second);

    if (multithread) log.Write("\tMultithread");
    else log.Write("\tSecuencial");

    Settings settings;
    FComm fcomm(settings, retries, delay, verbose, multithread);

    bool exito = false;
    if (command == "check")
        exito = fcomm.Check(get_optional_parameter(parameters, "ip"));
    else if (command == "broadcast")
        exito = fcomm.Broadcast(get_optional_parameter(parameters, "ip"));
    else if (command == "set_time")
        exito = fcomm.SetTime(get_optional_parameter(parameters, "ip"));
    else if (command == "get_fingerprints")
        exito = fcomm.GetFingerprints(parameters["staff"], parameters["ip"]);
    else if (command == "delete_fingerprints")
        exito = fcomm.DeleteFingerprints(parameters["staff"], get_optional_parameter(parameters, "ip"), get_optional_parameter(parameters, "fingers"));
    else if (command == "get_logs")
        exito = fcomm.GetLogs(get_optional_parameter(parameters, "ip"));
    else if (command == "process_logs")
        exito = fcomm.ProcessLogs();
    else if (command == "get_archives")
        exito = fcomm.GetArchives(get_optional_parameter(parameters, "ip"));    
    else if (command == "get_photos")
        exito = fcomm.GetPhotos(get_optional_parameter(parameters, "ip"), get_optional_parameter(parameters, "date_from"), get_optional_parameter(parameters, "date_to"));
    else if (command == "get_one_photo")
        exito = fcomm.GetOnePhoto(parameters["ip"], parameters["source"], parameters["target"]);
    else if (command == "decrypt_file")
        exito = fcomm.DecryptFile(parameters["source"]);

    log.Write("Saliendo en forma exitosa.");

    return exito ? EXIT_SUCCESS : EXIT_FAILURE;
     */
}
[root@Linux v2]# valgrind --track-origins=yes --leak-check=full --show-reachable=yes ./bioweds_client
==10441== Memcheck, a memory error detector
==10441== Copyright (C) 2002-2011, and GNU GPL'd, by Julian Seward et al.
==10441== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info
==10441== Command: ./bioweds_client
==10441== 
all commented
==10441== Invalid free() / delete / delete[] / realloc()
==10441==    at 0x4006C58: free (vg_replace_malloc.c:427)
==10441==    by 0x42EB637D: free_mem (in /lib/libc-2.5.so)
==10441==    by 0x42EB5F16: __libc_freeres (in /lib/libc-2.5.so)
==10441==    by 0x4002451: _vgnU_freeres (vg_preloaded.c:61)
==10441==    by 0x42E38EA3: _Exit (in /lib/libc-2.5.so)
==10441==    by 0x42DC0DF3: (below main) (in /lib/libc-2.5.so)
==10441==  Address 0x403f818 is not stack'd, malloc'd or (recently) free'd
==10441== 
==10441== 
==10441== HEAP SUMMARY:
==10441==     in use at exit: 0 bytes in 0 blocks
==10441==   total heap usage: 8 allocs, 9 frees, 186 bytes allocated
==10441== 
==10441== All heap blocks were freed -- no leaks are possible
==10441== 
==10441== For counts of detected and suppressed errors, rerun with: -v
==10441== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 33 from 8)
[root@Linux v2]#