简体   繁体   中英

Debug Assertion Failed Expression __acrt_first_block == header

I have been trying to figure out why this is happening and maybe it is just due to inexperience at this point but could really use some help.

When I run my code, which is compiled into a DLL using C++20, I get that a debug assertion has failed with the expression being __acrt_first_block == header.

I narrowed down where the code is failing, but the weird part is that it runs just fine when I change the Init(std::string filePath function signature to not contain the parameter. The code is below and hope someone can help.

Logger.h

#pragma once

#include "../Core.h"

#include <memory>
#include <string>
#include "spdlog/spdlog.h"

namespace Ruby
{
    class RUBY_API Logger
    {
    public:
        static void Init(std::string filePath);

        inline static std::shared_ptr<spdlog::logger>& GetCoreLogger() { return coreLogger; }
        inline static std::shared_ptr<spdlog::logger>& GetClientLogger() { return clientLogger; }

    private:
        static std::shared_ptr<spdlog::logger> coreLogger;
        static std::shared_ptr<spdlog::logger> clientLogger;
    };
}

Logger.cpp

namespace Ruby
{
    std::shared_ptr<spdlog::logger> Logger::coreLogger;
    std::shared_ptr<spdlog::logger> Logger::clientLogger;

    void Logger::Init(std::string filePath)
    {
        std::string pattern{ "%^[%r][%n][%l]: %v%$" };
        auto fileSink = std::make_shared<spdlog::sinks::basic_file_sink_mt>(filePath, true);

        // Setup the console and file sinks
        std::vector<spdlog::sink_ptr> coreSinks;
        coreSinks.push_back(std::make_shared<spdlog::sinks::stdout_color_sink_mt>());
        coreSinks.push_back(fileSink);
        // Bind the sinks to the core logger.
        coreLogger = std::make_shared<spdlog::logger>("RUBY", begin(coreSinks), end(coreSinks));
        // Set the Patterns for the sinks
        coreLogger->sinks()[0]->set_pattern(pattern);
        coreLogger->sinks()[1]->set_pattern(pattern);
        // Tell spdlog to flush the file loggers on trace or worse message (can be changed if necessary).
        coreLogger->flush_on(spdlog::level::trace);
        // Set the default level of the logger
        coreLogger->set_level(spdlog::level::trace);

        // Do the same for the client logger
        std::vector<spdlog::sink_ptr> clientSinks;
        clientSinks.push_back(std::make_shared<spdlog::sinks::stdout_color_sink_mt>());
        clientSinks.push_back(fileSink);
        clientLogger = std::make_shared<spdlog::logger>("APP", begin(clientSinks), end(clientSinks));
        clientLogger->sinks()[0]->set_pattern(pattern);
        clientLogger->sinks()[1]->set_pattern(pattern);
        clientLogger->flush_on(spdlog::level::trace);
        clientLogger->set_level(spdlog::level::trace);
    }
}

Entrypoint.h

#pragma once

#ifdef RB_PLATFORM_WINDOWS

extern Ruby::Application* Ruby::CreateApplication();

int main(int argc, char** argv)
{
    Ruby::Logger::Init("../Logs/Recent_Run.txt");
    RB_CORE_INFO("Initialized the logger.");

    auto app = Ruby::CreateApplication();
    app->Run();
    delete app;

    return 0;
}

#else
    #error Ruby only supports windows
#endif // RB_PLATFORM_WINDOWS

For anyone else who runs into a similar problem, here is how I fixed it.

Essentially the function signature for the Init() function was the problem. The std::string parameter was causing the debug assertion to fire, my best guess as of right now was because of move semantics but that part I am still not sure on. So there are a couple of ways that I found to fix this.

Method 1:

Make the parameter a const char* . I don't quite like this approach as it then relies on C style strings and if you are trying to write a program in modern C++, this is a huge step backwards.

Method 2:

Make the parameter a const std::string& . Making it a const reference to a string prevents the move semantics (again as far as I know) and the assertion no longer fires. I prefer this fix as it keeps the program in modern C++.

I hope this helps anyone who has similar issues, and be careful with statics and move semantics.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM