Skip to content

Commit

Permalink
- improved assert output further with debug
Browse files Browse the repository at this point in the history
 - fixed #3074
  


git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@24626 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
  • Loading branch information
Willi Braun committed Feb 18, 2015
1 parent 17420d7 commit f3fd414
Show file tree
Hide file tree
Showing 5 changed files with 81 additions and 28 deletions.
17 changes: 10 additions & 7 deletions Compiler/Template/CodegenC.tpl
Expand Up @@ -7494,13 +7494,15 @@ case RANGE(__) then
daeExp(eo, context, &preExp, &varDecls, &auxFunction)
else "1"
let stopValue = daeExp(stop, context, &preExp, &varDecls, &auxFunction)
let eqnsindx = match context case FUNCTION_CONTEXT(__) then '' else 'equationIndexes, '
let AddionalFuncName = match context case FUNCTION_CONTEXT(__) then '' else '_withEquationIndexes'
<<
<%preExp%>
<%startVar%> = <%startValue%>; <%stepVar%> = <%stepValue%>; <%stopVar%> = <%stopValue%>;
if(!<%stepVar%>)
{
FILE_INFO info = omc_dummyFileInfo;
omc_assert(threadData, info, "assertion range step != 0 failed");
omc_assert<%AddionalFuncName%>(threadData, info, <%eqnsindx%>"assertion range step != 0 failed");
}
else if(!(((<%stepVar%> > 0) && (<%startVar%> > <%stopVar%>)) || ((<%stepVar%> < 0) && (<%startVar%> < <%stopVar%>))))
{
Expand Down Expand Up @@ -10599,8 +10601,10 @@ template assertCommon(Exp condition, list<Exp> messages, Exp level, Context cont
let condVar = daeExp(condition, context, &preExpCond, &varDecls, &auxFunction)
let &preExpMsg = buffer ""
let msgVar = messages |> message => expToFormatString(message,context,&preExpMsg,&varDecls,&auxFunction) ; separator = ", "
let omcAssertFunc = match level case ENUM_LITERAL(index=2) then 'omc_assert_warning(' else 'omc_assert(threadData,'
let addInfoTextContext = match context case FUNCTION_CONTEXT(__) then '' else 'omc_assert_warning(info, "The following assertion has been violated at time %f\n<%Util.escapeModelicaStringToCString(printExpStr(condition))%>\n", time);'
let eqnsindx = match context case FUNCTION_CONTEXT(__) then '' else 'equationIndexes, '
let AddionalFuncName = match context case FUNCTION_CONTEXT(__) then '' else '_withEquationIndexes'
let addInfoTextContext = match context case FUNCTION_CONTEXT(__) then '' else '<%\n%>omc_assert_warning(info, "The following assertion has been violated at time %f\n<%Util.escapeModelicaStringToCString(printExpStr(condition))%>", time);'
let omcAssertFunc = match level case ENUM_LITERAL(index=2) then 'omc_assert_warning<%AddionalFuncName%>(' else 'omc_assert<%AddionalFuncName%>(threadData, '
let warningTriggered = tempDeclZero("static int", &varDecls)
let TriggerIf = match level case ENUM_LITERAL(index=2) then 'if(!<%warningTriggered%>)<%\n%>' else ''
let TriggerVarSet = match level case ENUM_LITERAL(index=2) then '<%warningTriggered%> = 1;<%\n%>' else ''
Expand All @@ -10611,9 +10615,8 @@ template assertCommon(Exp condition, list<Exp> messages, Exp level, Context cont
if(!<%condVar%>)
{
<%preExpMsg%>
FILE_INFO info = {<%infoArgs(info)%>};
<%addInfoTextContext%>
<%omcAssertFunc%>info, <%msgVar%>);
FILE_INFO info = {<%infoArgs(info)%>};<%addInfoTextContext%>
<%omcAssertFunc%>info, <%eqnsindx%><%msgVar%>);
<%TriggerVarSet%>
}
}<%\n%>
Expand Down Expand Up @@ -10643,7 +10646,7 @@ template assertCommonVar(Text condVar, Text msgVar, Context context, Text &preEx
{
<%preExpMsg%>
FILE_INFO info = {<%infoArgs(info)%>};
omc_assert_warning(info, "The following assertion has been violated at time: %f\n", time);
omc_assert_warning(info, "The following assertion has been violated at time %f", time);
throwStreamPrintWithEquationIndexes(threadData, equationIndexes, <%msgVar%>);
}<%\n%>
>>
Expand Down
55 changes: 41 additions & 14 deletions SimulationRuntime/c/simulation/simulation_runtime.cpp
Expand Up @@ -906,28 +906,24 @@ int _main_SimulationRuntime(int argc, char**argv, DATA *data)
return retVal;
}

static void omc_assert_simulation(threadData_t *threadData, FILE_INFO info, const char *msg, ...) __attribute__ ((noreturn));
static void omc_assert_simulation(threadData_t *threadData, FILE_INFO info, const char *msg, ...);
static void omc_assert_simulation_withEquationIndexes(threadData_t *threadData, FILE_INFO info, const int *indexes, const char *msg, ...);
static void omc_throw_simulation(threadData_t* threadData) __attribute__ ((noreturn));

static void omc_assert_simulation(threadData_t *threadData, FILE_INFO info, const char *msg, ...)
static void va_omc_assert_simulation_withEquationIndexes(threadData_t *threadData, FILE_INFO info, const int *indexes, const char *msg, va_list args)
{
va_list ap;
threadData = threadData ? threadData : (threadData_t*)pthread_getspecific(mmc_thread_data_key);
switch (threadData->currentErrorStage)
{
case ERROR_EVENTSEARCH:
case ERROR_SIMULATION:
va_start(ap, msg);
va_errorStreamPrint(LOG_ASSERT, 0, msg, ap);
va_end(ap);
va_errorStreamPrintWithEquationIndexes(LOG_ASSERT, 0, indexes, msg, args);
longjmp(*threadData->simulationJumpBuffer,1);
break;
case ERROR_NONLINEARSOLVER:
if(ACTIVE_STREAM(LOG_NLS))
{
va_start(ap, msg);
va_errorStreamPrint(LOG_ASSERT, 0, msg, ap);
va_end(ap);
va_errorStreamPrintWithEquationIndexes(LOG_ASSERT, 0, indexes, msg, args);
}
#ifndef OMC_EMCC
longjmp(*threadData->simulationJumpBuffer,1);
Expand All @@ -936,9 +932,7 @@ static void omc_assert_simulation(threadData_t *threadData, FILE_INFO info, cons
case ERROR_INTEGRATOR:
if(ACTIVE_STREAM(LOG_SOLVER))
{
va_start(ap, msg);
va_errorStreamPrint(LOG_ASSERT, 0, msg, ap);
va_end(ap);
va_errorStreamPrintWithEquationIndexes(LOG_ASSERT, 0, indexes, msg, args);
}
longjmp(*threadData->simulationJumpBuffer,1);
break;
Expand All @@ -948,11 +942,41 @@ static void omc_assert_simulation(threadData_t *threadData, FILE_INFO info, cons
}
}

static void omc_assert_simulation(threadData_t *threadData, FILE_INFO info, const char *msg, ...)
{
va_list args;
va_start(args, msg);
va_omc_assert_simulation_withEquationIndexes(threadData, info, NULL, msg, args);
va_end(args);
}

static void omc_assert_simulation_withEquationIndexes(threadData_t *threadData, FILE_INFO info, const int *indexes, const char *msg, ...)
{
va_list args;
va_start(args, msg);
va_omc_assert_simulation_withEquationIndexes(threadData, info, indexes, msg, args);
va_end(args);
}


static void va_omc_assert_warning_simulation(FILE_INFO info, const int *indexes, const char *msg, va_list args)
{
va_warningStreamPrintWithEquationIndexes(LOG_ASSERT, 0, indexes, msg, args);
}

static void omc_assert_warning_simulation(FILE_INFO info, const char *msg, ...)
{
va_list args;
va_start(args, msg);
va_warningStreamPrint(LOG_ASSERT, 0, msg, args);
va_omc_assert_warning_simulation(info, NULL, msg, args);
va_end(args);
}

static void omc_assert_warning_simulation_withEquationIndexes(FILE_INFO info, const int *indexes, const char *msg, ...)
{
va_list args;
va_start(args, msg);
va_omc_assert_warning_simulation(info, indexes, msg, args);
va_end(args);
}

Expand Down Expand Up @@ -985,7 +1009,10 @@ static void omc_throw_simulation(threadData_t* threadData)
longjmp(*threadData->globalJumpBuffer, 1);
}

void (*omc_assert)(threadData_t*,FILE_INFO info, const char *msg, ...) __attribute__ ((noreturn)) = omc_assert_simulation;
void (*omc_assert)(threadData_t*, FILE_INFO info, const char *msg, ...) = omc_assert_simulation;
void (*omc_assert_withEquationIndexes)(threadData_t*, FILE_INFO info, const int *indexes, const char *msg, ...) = omc_assert_simulation_withEquationIndexes;

void (*omc_assert_warning_withEquationIndexes)(FILE_INFO info, const int *indexes, const char *msg, ...) = omc_assert_warning_simulation_withEquationIndexes;
void (*omc_assert_warning)(FILE_INFO info, const char *msg, ...) = omc_assert_warning_simulation;
void (*omc_terminate)(FILE_INFO info, const char *msg, ...) = omc_terminate_simulation;
void (*omc_throw)(threadData_t*) __attribute__ ((noreturn)) = omc_throw_simulation;
Expand Down
2 changes: 1 addition & 1 deletion SimulationRuntime/c/simulation/solver/dassl.c
Expand Up @@ -753,7 +753,7 @@ continue_DASSL(int* idid, double* atol)
retValue = -9;
break;
case -10:
warningStreamPrint(LOG_STDOUT, 0, "A Modelica assert prevents the integrator to continue. For more information use -lv LOG_DASSL");
warningStreamPrint(LOG_STDOUT, 0, "A Modelica assert prevents the integrator to continue. For more information use -lv LOG_SOLVER");
retValue = -10;
break;
case -11:
Expand Down
19 changes: 18 additions & 1 deletion SimulationRuntime/c/util/omc_error.c
Expand Up @@ -156,7 +156,7 @@ void printInfo(FILE *stream, FILE_INFO info)
fprintf(stream, "[%s:%d:%d-%d:%d:%s]", info.filename, info.lineStart, info.colStart, info.lineEnd, info.colEnd, info.readonly ? "readonly" : "writable");
}

void omc_assert_function(threadData_t* threadData,FILE_INFO info, const char *msg, ...)
void omc_assert_function(threadData_t* threadData, FILE_INFO info, const char *msg, ...)
{
va_list ap;
va_start(ap,msg);
Expand Down Expand Up @@ -379,6 +379,15 @@ void warningStreamPrint(int stream, int indentNext, const char *format, ...)
}
}

void va_warningStreamPrintWithEquationIndexes(int stream, int indentNext, const int *indexes, const char *format, va_list args)
{
if (ACTIVE_WARNING_STREAM(stream)) {
char logBuffer[SIZE_LOG_BUFFER];
vsnprintf(logBuffer, SIZE_LOG_BUFFER, format, args);
messageFunction(LOG_TYPE_WARNING, stream, indentNext, logBuffer, 0, indexes);
}
}

void va_warningStreamPrint(int stream, int indentNext, const char *format, va_list args)
{
if (ACTIVE_WARNING_STREAM(stream)) {
Expand All @@ -405,6 +414,14 @@ void va_errorStreamPrint(int stream, int indentNext, const char *format, va_list
messageFunction(LOG_TYPE_ERROR, stream, indentNext, logBuffer, 0, NULL);
}

void va_errorStreamPrintWithEquationIndexes(int stream, int indentNext, const int *indexes, const char *format, va_list args)
{

char logBuffer[SIZE_LOG_BUFFER];
vsnprintf(logBuffer, SIZE_LOG_BUFFER, format, args);
messageFunction(LOG_TYPE_ERROR, stream, indentNext, logBuffer, 0, indexes);
}

#ifdef USE_DEBUG_OUTPUT
void debugStreamPrint(int stream, int indentNext, const char *format, ...)
{
Expand Down
16 changes: 11 additions & 5 deletions SimulationRuntime/c/util/omc_error.h
Expand Up @@ -56,13 +56,17 @@ typedef struct _FILE_INFO
#define omc_dummyFileInfo {"",-1,-1,-1,-1,1}

DLLExport extern void printInfo(FILE *stream, FILE_INFO info);
DLLExport extern void (*omc_assert)(threadData_t*,FILE_INFO,const char*, ...) __attribute__ ((noreturn));
DLLExport extern void (*omc_assert_warning)(FILE_INFO,const char*, ...);
DLLExport extern void (*omc_terminate)(FILE_INFO,const char*, ...);
DLLExport extern void (*omc_assert)(threadData_t*, FILE_INFO, const char*, ...);
DLLExport extern void (*omc_assert_warning)(FILE_INFO, const char*, ...);
DLLExport extern void (*omc_terminate)(FILE_INFO, const char*, ...);
DLLExport extern void (*omc_throw)(threadData_t*) __attribute__ ((noreturn));

DLLExport extern void (*omc_assert_withEquationIndexes)(threadData_t*,FILE_INFO, const int*, const char*, ...);
DLLExport extern void (*omc_assert_warning_withEquationIndexes)(FILE_INFO, const int*, const char*, ...);

void initDumpSystem();
void omc_assert_function(threadData_t*,FILE_INFO info, const char *msg, ...) __attribute__ ((noreturn));
void omc_assert_warning_function(FILE_INFO info, const char *msg, ...);
void omc_assert_function(threadData_t*,FILE_INFO info, const char *msg, ...);
void omc_assert_warning_function(FILE_INFO info, const char *msg, ...);
void omc_terminate_function(FILE_INFO info, const char *msg, ...);
void omc_throw_function(threadData_t*) __attribute__ ((noreturn));

Expand Down Expand Up @@ -164,8 +168,10 @@ extern void infoStreamPrintWithEquationIndexes(int stream, int indentNext, const
extern void warningStreamPrint(int stream, int indentNext, const char *format, ...) __attribute__ ((format (printf, 3, 4)));
extern void va_warningStreamPrint(int stream, int indentNext, const char *format,va_list ap);
extern void warningStreamPrintWithEquationIndexes(int stream, int indentNext, const int *indexes, const char *format, ...) __attribute__ ((format (printf, 4, 5)));
extern void va_warningStreamPrintWithEquationIndexes(int stream, int indentNext, const int *indexes, const char *format,va_list ap);
extern void errorStreamPrint(int stream, int indentNext, const char *format, ...) __attribute__ ((format (printf, 3, 4)));
extern void va_errorStreamPrint(int stream, int indentNext, const char *format, va_list ap);
extern void va_errorStreamPrintWithEquationIndexes(int stream, int indentNext, const int *indexes, const char *format,va_list ap);
extern void va_throwStreamPrint(threadData_t *threadData, const char *format, va_list ap) __attribute__ ((noreturn));
extern void throwStreamPrint(threadData_t *threadData, const char *format, ...) __attribute__ ((format (printf, 2, 3), noreturn));
extern void throwStreamPrintWithEquationIndexes(threadData_t *threadData, const int *indexes, const char *format, ...) __attribute__ ((format (printf, 3, 4), noreturn));
Expand Down

0 comments on commit f3fd414

Please sign in to comment.