我这里有这段代码:
这些是用于创建和停止 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/