c++ - 在 libpthread 链接应用程序中捕获异常时出现段错误(linux、C++)

标签 c++ linux pthreads segmentation-fault try-catch

我这里有这段代码:

这些是用于创建和停止 pthread 的函数:

void WatchdogController::conscious_process_handler_start() {

    if ( debug ) cout << "WatchdogController: starting conscious process thread" << endl;

    cn_pr_thread_active = true;

    if ( pthread_create( &cn_pr_thread, NULL, conscious_process_handler, this ) < 0 ) {
        cn_pr_thread_active = false;
        throw WatchdogException( "Unable to start new thread" );
    }
}

void WatchdogController::conscious_process_handler_stop() {

    if ( debug ) cout << "WatchdogController: stopping conscious process thread" << endl;

    cn_pr_thread_active = false;

    int *retval;

    pthread_join( cn_pr_thread, ( void ** )&retval );

    if ( *retval < 0 ) {
        delete retval;
        string err = string( "Error returned by conscious_process_handler(): " ) + string( pthread_err );
        throw WatchdogException( err.c_str() );
    }

    delete retval;
}

我在传递给 pthread 的函数中使用 select() ,当停止时它返回一个错误,导致 pthread 的返回值为负,但这不是问题,我稍后会修复它 - 问题是,当异常时被抛出这里:

throw WatchdogException( err.c_str() );

并在这里捕获:

try {
        watchdog_controller->hardware_watchdog_stop();
        watchdog_controller->unconscious_process_handler_stop();
        watchdog_controller->conscious_process_handler_stop();
    }
    catch ( HardwareWatchdogException &e ) {
        cerr << "Error stopping hardware watchdog!" << endl;
        cerr << e.get_reason() << endl;
        string err = string( "Exception thrown by hardware watchdog controller" ) + string( e.get_reason() );
        if ( log ) write_log( err.c_str() );
        delete watchdog_controller;
        return -1;
    }
    catch ( WatchdogException &e ) {
        cerr << "Exception cought when exiting!" << endl;
        cerr << e.get_reason() << endl;
        string err = string( "Exception cought when exiting" ) + string( e.get_reason() );
        if ( log ) write_log( err.c_str() );
        delete watchdog_controller;
        return -1;
    }

我遇到段错误,然后尝试访问该对象:

cerr << e.get_reason() << endl;

可能是什么原因?

引用 &e 指向某个内容,但该地址似乎无效。

这是异常类:

class WatchdogException {

    public:

        /**
            @brief      Default constructor
        */
        WatchdogException() : reason() {
        }

        /**
            @brief      Overloaded constructor - setting the error message
            @param      why         Error message
        */
        WatchdogException( const char *why ) : reason( why ) {
        }

        /**
            @brief      The destructor
        */
        virtual ~WatchdogException() {
        }

        /**
            @brief      A getter for the error message
            @return     Returns a string containing error description
        */
        virtual std::string get_reason() const {
            return reason;
        }

    protected:

        /**
            @var        reason      String containing the error message
        */
        std::string reason;

};

最佳答案

我猜测您没有为 retval 正确分配内存,或者不知何故你从 cn_pr_thread 返回一个无效的指针,这就是为什么当你调用 pthread_join 时会出现段错误。 。

关于c++ - 在 libpthread 链接应用程序中捕获异常时出现段错误(linux、C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1648424/

相关文章:

c++ - 如何定位正在执行 I/O 的代码

c++ - lib(发布)或 libd(调试),Qt 可以为我解决这个问题吗?

linux - linux下修改网络接口(interface)名称,忽略文件70-persistent-net.rules

c - 使用 ptrace 停止或杀死进程中的线程?

c++ - 创建一个 C++ 宏,可以轻松创建虚函数包装函数

c++ - 是否可以在已分配的内存上初始化 std::vector ?

linux - connect() 函数的基本 Shellcode

linux - 自己的RS232设备作为linux文件系统设备

linux - 什么时候 clone() 和 fork 比 pthreads 更好?

c - C中指针值变化的可能原因?