我有這樣一段代碼在這裏:分段故障在的libpthread鏈接的應用程序捕獲異常時(linux下,C++)
這些是用於創建和停止並行線程功能:
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;
}
我用select()函數傳遞給pthread,並在停止時返回一個錯誤,導致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;
};
它是否有任何區別,如果你通過const引用它呢? – Naveen 2009-10-30 07:26:51
這裏沒有什麼明顯的錯誤。你能在gdb中獲得回溯嗎? – 2009-10-30 07:41:08
在gdb下運行時,它凍結在pthread_join上 - 我認爲它與gdb沒有正確傳遞信號有關 - 我如何配置gdb以將所有信號傳遞給程序? – zbigh 2009-10-30 08:08:06