繁体   English   中英

无法找到此 std::logic_error 的来源

[英]Can't find where this std::logic_error is coming from

当我定义了 CAMERA_NAME 环境变量时,我的应用程序工作得很好,但是一旦我从我的 docker-compose 文件中删除该变量,容器将返回一个非常无用的错误消息,它没有提供诸如什么变量/行之类的信息错误发生在:

basler-hd     | terminate called after throwing an instance of 'std::logic_error'
basler-hd     |   what():  basic_string::_M_construct null not valid

这是相关代码:

    try {
        char const* camera_name_ = std::getenv("CAMERA_NAME");
        if (!camera_name_)
            camera_name_ = generate_uuid_v4().c_str();
        
        init_loggers(camera_name_);
        SPDLOG_INFO("Camera name (found in environment or was generated): {}", camera_name_);

        SPDLOG_INFO("Starting Application.");
        PylonInitialize();

        mqtt::async_client client(DEFAULT_SERVER_ADDRESS, CLIENT_ID, PERSIST_DIRECTORY);
        
        auto willMessage = mqtt::message("nssams/camera", "Camera Disconnected", 1, true);
        auto connectionOptions = mqtt::connect_options_builder()
                                    .clean_session()
                                    .will(willMessage)
                                    .finalize();

        std::string ip_address = std::getenv("IP_ADDRESS") != NULL ? std::string(std::getenv("IP_ADDRESS")) : "192.168.0.1";
        if (ip_address.compare("192.168.0.1") == 0)
            SPDLOG_WARN("No IP address was found in environment, setting to '192.168.0.1'");

        std::string camera_name(camera_name_);
        // Instantiate Camera instance and connect. 
        Camera::MqttBaslerCamera camera( client, camera_name );
        try {
            camera.discover_and_create_device(ip_address);
        } catch (Camera::MqttBaslerCamera::DeviceNotFoundException & ex){
            SPDLOG_CRITICAL("No device found matching IP [{}] from environment", ip_address);
            PylonTerminate();
            return 1;
        }
        camera.connect();
        
        // Assign the Camera instance as the mqtt callback handler.
        client.set_callback(camera);

我只是在努力寻找问题所在。 在尝试从 CAMERA_NAME 环境变量中获取值后,我正在检查 NULL。 如果它是 NULL,我将在继续之前将其设置为一个值。

我只是不知道它在哪里崩溃,因为错误消息太模糊了,如果我添加任何 log/cout 语句,它们甚至不会因为这个错误而运行,所以我不知道它是在什么时候崩溃的

要查看错误的来源,您可以使用调试器逐行调试代码以查找意外发生的位置。

如果它是 NULL,我将在继续之前将其设置为一个值。

camera_name_是一个指针。 它不是字符串。 它可以指向一个 C 字符串。 这里:

camera_name_ = generate_uuid_v4().c_str();

您使其指向generate_uuid_v4()返回的字符串的内部缓冲区。 如果 function 按值返回字符串,则此字符串是临时的,在行尾不再存在。 您存储在camera_name_中的指针然后悬空。 如果 function 将返回对存储在别处的字符串的引用,保留指向它的指针就可以了。

当您真正想要存储字符串时,不要使用指向字符串的指针:

#include <string>
#include <iostream>

const char* getenv() {
    return nullptr;
}

std::string generate_uid() {
    return "asd";
}

int main() {
    std::string name;
    if (auto env = getenv(); env == nullptr){
        name = generate_uid();
    } else {
        name = std::string(env);
    }
    std::cout << name;
}
    

没有更多上下文,只能猜测:

我认为这是一个logical_error

        std::string camera_name(camera_name_);

如果camera_name_nullptr 如果找不到系统变量,这可能是std::getenv返回的内容。

如果这是问题所在,修复方法取决于您在环境变量不存在的情况下真正想对该变量做什么?

        std::string camera_name(camera_name_?camera_name_:"defaultName");

或者如果你太酷了 C++(非标准)

        std::string camera_name(camera_name_?:"defaultName");

事实上,您已经在为std::string ip_address这样做了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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