changed qse_assert_filed() to dump backtraces
This commit is contained in:
		| @ -23,6 +23,12 @@ | ||||
|  | ||||
| #include <qse/cmn/sio.h> | ||||
|  | ||||
| #ifdef HAVE_EXECINFO_H | ||||
| #	include <execinfo.h> | ||||
| #	include <stdlib.h> | ||||
| #	include <qse/cmn/str.h> | ||||
| #endif | ||||
|  | ||||
| #ifdef _WIN32 | ||||
| #       include <windows.h> | ||||
| #else | ||||
| @ -71,6 +77,15 @@ void qse_assert_failed ( | ||||
| 	const qse_char_t* expr, const qse_char_t* desc,  | ||||
| 	const qse_char_t* file, qse_size_t line) | ||||
| { | ||||
| #ifdef HAVE_BACKTRACE | ||||
| 	void *btarray[128]; | ||||
| 	qse_size_t btsize, i; | ||||
| 	char **btsyms; | ||||
| #ifdef QSE_CHAR_IS_WCHAR | ||||
| 	qse_wchar_t wcs[256]; | ||||
| #endif | ||||
| #endif | ||||
|  | ||||
| 	qse_sio_puts (QSE_SIO_ERR, QSE_T("=[ASSERTION FAILURE]============================================================\n")); | ||||
|  | ||||
| 	qse_sio_puts (QSE_SIO_ERR, QSE_T("FILE ")); | ||||
| @ -89,6 +104,30 @@ void qse_assert_failed ( | ||||
| 		qse_sio_puts (QSE_SIO_ERR, desc); | ||||
| 		qse_sio_puts (QSE_SIO_ERR, QSE_T("\n")); | ||||
| 	} | ||||
|  | ||||
| #ifdef HAVE_BACKTRACE | ||||
| 	btsize = backtrace (btarray, QSE_COUNTOF(btarray)); | ||||
| 	btsyms = backtrace_symbols (btarray, btsize); | ||||
| 	if (btsyms != QSE_NULL) | ||||
| 	{ | ||||
| 		qse_sio_puts (QSE_SIO_ERR, QSE_T("=[BACKTRACES]===================================================================\n")); | ||||
|  | ||||
| 		for (i = 0; i < btsize; i++) | ||||
| 		{ | ||||
| 		#ifdef QSE_CHAR_IS_MCHAR | ||||
| 			qse_sio_puts (QSE_SIO_ERR, btsyms[i]); | ||||
| 		#else | ||||
| 			qse_size_t wcslen = QSE_COUNTOF(wcs); | ||||
| 			qse_mbstowcs (btsyms[i], wcs, &wcslen); | ||||
| 			qse_sio_puts (QSE_SIO_ERR, wcs); | ||||
| 		#endif | ||||
| 			qse_sio_puts (QSE_SIO_ERR, QSE_T("\n")); | ||||
| 		} | ||||
|  | ||||
| 		free (btsyms); | ||||
| 	} | ||||
| #endif | ||||
|  | ||||
| 	qse_sio_puts (QSE_SIO_ERR, QSE_T("================================================================================\n")); | ||||
| 	qse_sio_flush (QSE_SIO_ERR); | ||||
|  | ||||
|  | ||||
		Reference in New Issue
	
	Block a user