Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in / Register
Toggle navigation
O
opencv
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Packages
Packages
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
submodule
opencv
Commits
10c92271
Commit
10c92271
authored
Apr 23, 2018
by
Alexander Alekhin
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
core: CV_Error with set_terminate() on Windows
To dump contents of the last OpenCV error
parent
9615f8c9
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
62 additions
and
15 deletions
+62
-15
system.cpp
modules/core/src/system.cpp
+62
-15
No files found.
modules/core/src/system.cpp
View file @
10c92271
...
...
@@ -71,12 +71,26 @@ static bool param_dumpErrors = utils::getConfigurationParameterBool("OPENCV_DUMP
}
// namespace cv
#ifndef CV_ERROR_SET_TERMINATE_HANDLER // build config option
# if defined(_WIN32)
# define CV_ERROR_SET_TERMINATE_HANDLER 1
# endif
#endif
#if CV_ERROR_SET_TERMINATE_HANDLER == 0
# undef CV_ERROR_SET_TERMINATE_HANDLER
#endif
#ifdef _MSC_VER
# if _MSC_VER >= 1700
# pragma warning(disable:4447) // Disable warning 'main' signature found without threading model
# endif
#endif
#ifdef CV_ERROR_SET_TERMINATE_HANDLER
#include <exception> // std::set_terminate
#include <cstdlib> // std::abort
#endif
#if defined __ANDROID__ || defined __linux__ || defined __FreeBSD__ || defined __HAIKU__
# include <unistd.h>
# include <fcntl.h>
...
...
@@ -925,28 +939,61 @@ int cv_vsnprintf(char* buf, int len, const char* fmt, va_list args)
#endif
}
static
void
dumpException
(
const
Exception
&
exc
)
{
const
char
*
errorStr
=
cvErrorStr
(
exc
.
code
);
char
buf
[
1
<<
12
];
cv_snprintf
(
buf
,
sizeof
(
buf
),
"OpenCV(%s) Error: %s (%s) in %s, file %s, line %d"
,
CV_VERSION
,
errorStr
,
exc
.
err
.
c_str
(),
exc
.
func
.
size
()
>
0
?
exc
.
func
.
c_str
()
:
"unknown function"
,
exc
.
file
.
c_str
(),
exc
.
line
);
#ifdef __ANDROID__
__android_log_print
(
ANDROID_LOG_ERROR
,
"cv::error()"
,
"%s"
,
buf
);
#else
fflush
(
stdout
);
fflush
(
stderr
);
fprintf
(
stderr
,
"%s
\n
"
,
buf
);
fflush
(
stderr
);
#endif
}
#ifdef CV_ERROR_SET_TERMINATE_HANDLER
static
bool
cv_terminate_handler_installed
=
false
;
static
std
::
terminate_handler
cv_old_terminate_handler
;
static
cv
::
Exception
cv_terminate_handler_exception
;
static
bool
param_setupTerminateHandler
=
utils
::
getConfigurationParameterBool
(
"OPENCV_SETUP_TERMINATE_HANDLER"
,
true
);
static
void
cv_terminate_handler
()
{
std
::
cerr
<<
"OpenCV: terminate handler is called! The last OpenCV error is:
\n
"
;
dumpException
(
cv_terminate_handler_exception
);
if
(
false
/*cv_old_terminate_handler*/
)
// buggy behavior is observed with doubled "abort/retry/ignore" windows
cv_old_terminate_handler
();
abort
();
}
#endif
void
error
(
const
Exception
&
exc
)
{
#ifdef CV_ERROR_SET_TERMINATE_HANDLER
{
cv
::
AutoLock
lock
(
getInitializationMutex
());
if
(
!
cv_terminate_handler_installed
)
{
if
(
param_setupTerminateHandler
)
cv_old_terminate_handler
=
std
::
set_terminate
(
cv_terminate_handler
);
cv_terminate_handler_installed
=
true
;
}
cv_terminate_handler_exception
=
exc
;
}
#endif
if
(
customErrorCallback
!=
0
)
customErrorCallback
(
exc
.
code
,
exc
.
func
.
c_str
(),
exc
.
err
.
c_str
(),
exc
.
file
.
c_str
(),
exc
.
line
,
customErrorCallbackData
);
else
if
(
param_dumpErrors
)
{
const
char
*
errorStr
=
cvErrorStr
(
exc
.
code
);
char
buf
[
1
<<
12
];
cv_snprintf
(
buf
,
sizeof
(
buf
),
"OpenCV(%s) Error: %s (%s) in %s, file %s, line %d"
,
CV_VERSION
,
errorStr
,
exc
.
err
.
c_str
(),
exc
.
func
.
size
()
>
0
?
exc
.
func
.
c_str
()
:
"unknown function"
,
exc
.
file
.
c_str
(),
exc
.
line
);
#ifdef __ANDROID__
__android_log_print
(
ANDROID_LOG_ERROR
,
"cv::error()"
,
"%s"
,
buf
);
#else
fflush
(
stdout
);
fflush
(
stderr
);
fprintf
(
stderr
,
"%s
\n
"
,
buf
);
fflush
(
stderr
);
#endif
dumpException
(
exc
);
}
if
(
breakOnError
)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment