source: src/Helpers/Assert.cpp@ 9cd807

Action_Thermostats Add_AtomRandomPerturbation Add_FitFragmentPartialChargesAction Add_RotateAroundBondAction Add_SelectAtomByNameAction Added_ParseSaveFragmentResults AddingActions_SaveParseParticleParameters Adding_Graph_to_ChangeBondActions Adding_MD_integration_tests Adding_ParticleName_to_Atom Adding_StructOpt_integration_tests AtomFragments Automaking_mpqc_open AutomationFragmentation_failures Candidate_v1.5.4 Candidate_v1.6.0 Candidate_v1.6.1 ChangeBugEmailaddress ChangingTestPorts ChemicalSpaceEvaluator CombiningParticlePotentialParsing Combining_Subpackages Debian_Package_split Debian_package_split_molecuildergui_only Disabling_MemDebug Docu_Python_wait EmpiricalPotential_contain_HomologyGraph EmpiricalPotential_contain_HomologyGraph_documentation Enable_parallel_make_install Enhance_userguide Enhanced_StructuralOptimization Enhanced_StructuralOptimization_continued Example_ManyWaysToTranslateAtom Exclude_Hydrogens_annealWithBondGraph FitPartialCharges_GlobalError Fix_BoundInBox_CenterInBox_MoleculeActions Fix_ChargeSampling_PBC Fix_ChronosMutex Fix_FitPartialCharges Fix_FitPotential_needs_atomicnumbers Fix_ForceAnnealing Fix_IndependentFragmentGrids Fix_ParseParticles Fix_ParseParticles_split_forward_backward_Actions Fix_PopActions Fix_QtFragmentList_sorted_selection Fix_Restrictedkeyset_FragmentMolecule Fix_StatusMsg Fix_StepWorldTime_single_argument Fix_Verbose_Codepatterns Fix_fitting_potentials Fixes ForceAnnealing_goodresults ForceAnnealing_oldresults ForceAnnealing_tocheck ForceAnnealing_with_BondGraph ForceAnnealing_with_BondGraph_continued ForceAnnealing_with_BondGraph_continued_betteresults ForceAnnealing_with_BondGraph_contraction-expansion FragmentAction_writes_AtomFragments FragmentMolecule_checks_bonddegrees GeometryObjects Gui_Fixes Gui_displays_atomic_force_velocity ImplicitCharges IndependentFragmentGrids IndependentFragmentGrids_IndividualZeroInstances IndependentFragmentGrids_IntegrationTest IndependentFragmentGrids_Sole_NN_Calculation JobMarket_RobustOnKillsSegFaults JobMarket_StableWorkerPool JobMarket_unresolvable_hostname_fix MoreRobust_FragmentAutomation ODR_violation_mpqc_open PartialCharges_OrthogonalSummation PdbParser_setsAtomName PythonUI_with_named_parameters QtGui_reactivate_TimeChanged_changes Recreated_GuiChecks Rewrite_FitPartialCharges RotateToPrincipalAxisSystem_UndoRedo SaturateAtoms_findBestMatching SaturateAtoms_singleDegree StoppableMakroAction Subpackage_CodePatterns Subpackage_JobMarket Subpackage_LinearAlgebra Subpackage_levmar Subpackage_mpqc_open Subpackage_vmg Switchable_LogView ThirdParty_MPQC_rebuilt_buildsystem TrajectoryDependenant_MaxOrder TremoloParser_IncreasedPrecision TremoloParser_MultipleTimesteps TremoloParser_setsAtomName Ubuntu_1604_changes stable
Last change on this file since 9cd807 was bf3817, checked in by Frederik Heber <heber@…>, 15 years ago

Added ifdef HAVE_CONFIG and config.h include to each and every cpp file.

  • is now topmost in front of MemDebug.hpp (and any other).
  • Property mode set to 100644
File size: 5.3 KB
Line 
1/*
2 * Assert.cpp
3 *
4 * Created on: Mar 18, 2010
5 * Author: crueger
6 */
7
8// include config.h
9#ifdef HAVE_CONFIG_H
10#include <config.h>
11#endif
12
13#include "Helpers/MemDebug.hpp"
14
15#include "Helpers/Assert.hpp"
16#include <iostream>
17
18using namespace std;
19
20namespace Assert{
21 AssertionFailure::AssertionFailure(std::string _condition,
22 std::string _file,
23 int _line,
24 std::string _message) :
25 condition(_condition),
26 file(_file),
27 line(_line),
28 message(_message)
29 {}
30
31 std::string AssertionFailure::getFile(){
32 return file;
33 }
34
35 int AssertionFailure::getLine(){
36 return line;
37 }
38
39 std::string AssertionFailure::getMessage(){
40 return message;
41 }
42
43 std::ostream& AssertionFailure::operator<<(std::ostream& out){
44 out << "Assertion \"" << condition << "\" failed in file " << file << " at line " << line << endl;
45 out << "Assertion Message: " << message << std::endl;
46 return out;
47 }
48
49 const char ActionKeys[] = {'\0','a','t','i'};
50 const char* ActionNames[] = {"Ask","Abort","Throw","Ignore"};
51}
52
53#ifndef NDEBUG
54
55#ifdef __GNUC__
56#include <cstdlib>
57#include <execinfo.h>
58#include <cxxabi.h>
59#endif
60
61Assert::Action Assert::_my_assert::defaultAction = Ask;
62std::vector<Assert::hook_t> Assert::_my_assert::hooks;
63
64std::map<std::string,bool> Assert::_wrapper::ignores;
65const char* Assert::_wrapper::message_ptr = "source pointer did not point to object of desired type";
66const char* Assert::_wrapper::message_ref = "source reference did not contain object of desired type";
67
68bool Assert::_my_assert::check(const char* condition,
69 const char* message,
70 const char* filename,
71 const int line,
72 bool& ignore)
73{
74 cout << "Assertion \"" << condition << "\" failed in file " << filename << " at line " << line << endl;
75 cout << "Assertion Message: " << message << std::endl;
76 while(true){
77 char choice;
78 if(defaultAction==Assert::Ask) {
79#ifdef __GNUC__
80 cout << "Please choose: (a)bort, (t)hrow execption, show (b)actrace, (i)gnore, al(w)ays ignore" << endl;
81#else
82 cout << "Please choose: (a)bort, (t)hrow execption, (i)gnore, al(w)ays ignore" << endl;
83#endif /* __GNUC__ */
84 cin >> choice;
85 }
86 else{
87 choice = ActionKeys[defaultAction];
88 }
89 switch(choice){
90 case 'a':
91 return true;
92 break;
93 case 't':
94 throw AssertionFailure(condition,filename,line,message);
95 break;
96#ifdef __GNUC__
97 case 'b':
98 Assert::_my_assert::backtrace(filename,line);
99 break;
100#endif /* __GNUC__ */
101 case 'w':
102 ignore = true;
103 // fallthrough
104 case 'i':
105 return false;
106 break;
107 }
108 }
109 return false;
110}
111
112#ifdef __GNUC__
113void Assert::_my_assert::backtrace(const char *file, int line){
114 const size_t max_depth = 100;
115 void* stack_addrs[max_depth];
116 size_t stack_depth;
117 char **stack_strings=0;
118 const char *func_name=0;
119 size_t sz = 64;
120
121 // get the backtrace
122 stack_depth = ::backtrace(stack_addrs,max_depth);
123 stack_strings = backtrace_symbols(stack_addrs, stack_depth);
124 // used later for demangling
125 // reserved here, so we can free it unconditionally
126 char *dm_function = static_cast<char*>(malloc(sz));
127 if(!dm_function){
128 // malloc failed... we are out of luck
129 cout << "cannot provide stack trace due to exhausted memory" << endl;
130 return;
131 }
132
133 cout << "Backtrace from " << file << "@" << line << ":" << endl;
134
135 // i=2 because we don't want this function, nor the assertion handler
136 for(unsigned int i=2;i<stack_depth-2;++i){
137 // find the mangled function name
138 char *begin = stack_strings[i];
139 // function name starts with a (
140 while(*begin && *begin!='(') ++begin;
141 char *end=begin;
142 while(*end && *end!='+') ++end;
143
144 // see if we found our function name
145 if(*begin && *end){
146 *begin++ = 0;
147 *end = 0;
148 // use the C++ demangler
149
150 int status;
151 char *func_ret = abi::__cxa_demangle(begin, dm_function, &sz, &status);
152 if(func_ret){
153 // abi might have realloced...
154 dm_function = func_ret;
155 func_name = dm_function;
156 }
157 else{
158 // demangling failed... get the function name without demangling
159 func_name = begin;
160 }
161 }
162 else{
163 // function name not found... get the whole line
164 func_name = stack_strings[i];
165 }
166 cout << func_name << endl;
167 }
168 free(dm_function);
169 free(stack_strings); // malloc()ed by backtrace_symbols
170}
171#endif /* __GNUC__ */
172
173void Assert::_my_assert::doHooks(){
174 for(vector<hook_t>::reverse_iterator iter = hooks.rbegin(); iter!=hooks.rend(); ++iter ){
175 (*iter)();
176 }
177}
178
179void Assert::_my_assert::addHook(hook_t hook){
180 hooks.push_back(hook);
181}
182
183void Assert::_my_assert::removeHook(Assert::hook_t hook){
184 for(vector<hook_t>::iterator iter = hooks.begin(); iter!=hooks.end();){
185 if((*iter)==hook){
186 iter = hooks.erase(iter);
187 }
188 else{
189 ++iter;
190 }
191 }
192}
193
194void Assert::_my_assert::setDefault(Assert::Action action){
195 defaultAction = action;
196}
197Assert::Action Assert::_my_assert::getDefault(){
198 return defaultAction;
199}
200std::string Assert::_my_assert::printDefault(){
201 return ActionNames[defaultAction];
202}
203
204#endif
205
Note: See TracBrowser for help on using the repository browser.