NEURON
debug.cpp
Go to the documentation of this file.
1 #include <../../nrnconf.h>
2 /* /local/src/master/nrn/src/oc/debug.cpp,v 1.7 1996/04/09 16:39:14 hines Exp */
3 
4 #include "hocdec.h"
5 #include "code.h"
6 #include "equation.h"
7 #include "multicore.h"
8 #include <stdio.h>
9 
10 #include "utils/logger.hpp"
11 
12 #include "nrndigest.h"
13 #if NRN_DIGEST
14 #include <openssl/sha.h>
15 #include <vector>
16 #include <string>
17 #endif
18 
20 
21 #define prcod(c1, c2) else if (p->pf == c1) Printf("%p %p %s", fmt::ptr(p), fmt::ptr(p->pf), c2)
22 
23 void hoc_debug(void) /* print the machine */
24 {
25  if (hoc_zzdebug == 0)
26  hoc_zzdebug = 1;
27  else
28  hoc_zzdebug = 0;
29 }
30 
31 /* running copy of calls to execute */
32 void debugzz(Inst* p) {
33 #if !OCSMALL
34  {
35  if (p->in == STOP)
36  Printf("STOP\n");
37  prcod(hoc_nopop, "POP\n");
38  prcod(hoc_eval, "EVAL\n");
39  prcod(hoc_add, "ADD\n");
40  prcod(hoc_sub, "SUB\n");
41  prcod(hoc_mul, "MUL\n");
42  prcod(hoc_div, "DIV\n");
43  prcod(hoc_negate, "NEGATE\n");
44  prcod(hoc_power, "POWER\n");
45  prcod(hoc_assign, "ASSIGN\n");
46  prcod(hoc_bltin, "BLTIN\n");
47  prcod(hoc_varpush, "VARPUSH\n");
48  prcod(hoc_constpush, "CONSTPUSH\n");
49  prcod(hoc_pushzero, "PUSHZERO\n");
50  prcod(hoc_print, "PRINT\n");
51  prcod(hoc_varread, "VARREAD\n");
52  prcod(hoc_prexpr, "PREXPR\n");
53  prcod(hoc_prstr, "PRSTR\n");
54  prcod(hoc_gt, "GT\n");
55  prcod(hoc_lt, "LT\n");
56  prcod(hoc_eq, "EQ\n");
57  prcod(hoc_ge, "GE\n");
58  prcod(hoc_le, "LE\n");
59  prcod(hoc_ne, "NE\n");
60  prcod(hoc_and, "AND\n");
61  prcod(hoc_or, "OR\n");
62  prcod(hoc_not, "NOT\n");
63  prcod(hoc_ifcode, "IFCODE\n");
64  prcod(hoc_forcode, "FORCODE\n");
65  prcod(hoc_shortfor, "SHORTFOR\n");
66  prcod(hoc_call, "CALL\n");
67  prcod(hoc_arg, "ARG\n");
68  prcod(hoc_argassign, "ARGASSIGN\n");
69  prcod(hoc_funcret, "FUNCRET\n");
70  prcod(hoc_procret, "PROCRET\n");
71  prcod(hocobjret, "HOCOBJRET\n");
72  prcod(hoc_iterator_stmt, "hoc_iterator_stmt\n");
73  prcod(hoc_iterator, "hoc_iterator\n");
74  prcod(hoc_argrefasgn, "ARGREFASSIGN\n");
75  prcod(hoc_argref, "ARGREF\n");
76  prcod(hoc_stringarg, "STRINGARG\n");
77  prcod(hoc_Break, "Break\n");
78  prcod(hoc_Continue, "Continue\n");
79  prcod(hoc_Stop, "Stop()\n");
80  prcod(hoc_assstr, "assstr\n");
81  prcod(hoc_evalpointer, "evalpointer\n");
82  prcod(hoc_newline, "newline\n");
83  prcod(hoc_delete_symbol, "delete_symbol\n");
84  prcod(hoc_cyclic, "cyclic\n");
85 
86  prcod(hoc_dep_make, "DEPENDENT\n");
87  prcod(hoc_eqn_name, "EQUATION\n");
88  prcod(hoc_eqn_init, "eqn_init()\n");
89  prcod(hoc_eqn_lhs, "eqn_lhs()\n");
90  prcod(hoc_eqn_rhs, "eqn_rhs()\n");
91  /*OOP*/
92  prcod(hoc_push_current_object, "hoc_push_current_object\n");
93  prcod(hoc_objectvar, "objectvar\n");
94  prcod(hoc_object_component, "objectcomponent()\n");
95  prcod(hoc_object_eval, "objecteval\n");
96  prcod(hoc_object_asgn, "objectasgn\n");
97  prcod(hoc_objvardecl, "objvardecl\n");
98  prcod(hoc_cmp_otype, "cmp_otype\n");
99  prcod(hoc_newobj, "newobject\n");
100  prcod(hoc_asgn_obj_to_str, "assignobj2str\n");
101  prcod(hoc_known_type, "known_type\n");
102  prcod(hoc_push_string, "push_string\n");
103  prcod(hoc_objectarg, "hoc_objectarg\n");
104  prcod(hoc_ob_pointer, "hoc_ob_pointer\n");
105  prcod(hoc_constobject, "hoc_constobject\n");
106 
107  /*NEWCABLE*/
108  prcod(connect_obsec_syntax, "connect_obsec_syntax()\n");
109  prcod(connectsection, "connectsection()\n");
110  prcod(simpleconnectsection, "simpleconnectsection()\n");
111  prcod(connectpointer, "connectpointer()\n");
112  prcod(add_section, "add_section()\n");
113  prcod(range_const, "range_const()\n");
114  prcod(range_interpolate, "range_interpolate()\n");
115  prcod(range_interpolate_single, "range_interpolate_single()\n");
116  prcod(rangevareval, "rangevareval()\n");
117  prcod(rangepoint, "rangepoint()\n");
118  prcod(sec_access, "sec_access()\n");
119  prcod(ob_sec_access, "ob_sec_access()\n");
120  prcod(mech_access, "mech_access()\n");
121  prcod(for_segment, "forsegment()\n");
122  prcod(sec_access_push, "sec_access_push()\n");
123  prcod(sec_access_pop, "sec_access_pop()\n");
124  prcod(forall_section, "forall_section()\n");
125  prcod(hoc_ifsec, "hoc_ifsec()\n");
126  prcod(hoc_ifseclist, "hocifseclist()\n");
127  prcod(forall_sectionlist, "forall_sectionlist()\n");
128  prcod(connect_point_process_pointer, "connect_point_process_pointer\n");
129  prcod(nrn_cppp, "nrn_cppp()\n");
130  prcod(rangevarevalpointer, "rangevarevalpointer\n");
131  prcod(sec_access_object, "sec_access_object\n");
132  prcod(mech_uninsert, "mech_uninsert\n");
133  else {
134  size_t offset = (size_t) p->in;
135  if (offset < 1000)
136  Printf("relative %d\n", p->i);
137  else {
138  offset = (size_t) (p->in) - (size_t) p;
139  if (offset > (size_t) hoc_prog - (size_t) p &&
140  offset < (size_t) (&hoc_prog[2000]) - (size_t) p)
141  Printf("relative %ld\n", p->in - p);
142  else if (p->sym->name != (char*) 0) {
143  if (p->sym->name[0] == '\0') {
144  Printf("constant or string pointer\n");
145  /*Printf("value=%g\n", p->sym->u.val);*/
146  } else
147  Printf("%s\n", p->sym->name);
148  } else
149  Printf("symbol without name\n");
150  }
151  }
152  p++;
153  }
154 #endif /*OCSMALL*/
155 }
156 
157 #if NRN_DIGEST
158 
159 int nrn_digest_;
160 static std::vector<std::vector<std::string>> digest; // nthread string vectors
161 static std::vector<size_t> digest_cnt; // nthread counts.
162 static int nrn_digest_print_item_ = -1;
163 static int nrn_digest_print_tid_ = 0;
164 static bool nrn_digest_abort_ = false;
165 
166 void nrn_digest() {
167  if (ifarg(1) && hoc_is_str_arg(1)) {
168  // print the digest to the file and turn off accumulation
169  const char* fname = gargstr(1);
170  FILE* f = fopen(fname, "w");
171  if (!f) {
172  hoc_execerr_ext("Could not open %s for writing", fname);
173  }
174 
175  int tid = 0;
176  for (auto& d: digest) {
177  fprintf(f, "tid=%d size=%zd\n", tid, digest[tid].size());
178  for (auto& s: d) {
179  fprintf(f, "%s\n", s.c_str());
180  }
181  tid++;
182  }
183  fclose(f);
184  nrn_digest_ = 0;
185  } else { // start accumulating digest info
186  nrn_digest_ = 1;
187  nrn_digest_print_item_ = -1;
188  nrn_digest_print_tid_ = 0;
189  if (ifarg(2)) {
190  nrn_digest_print_tid_ = int(chkarg(1, 0., nrn_nthread - 1));
191  nrn_digest_print_item_ = int(chkarg(2, 0., 1e9));
192  }
193  nrn_digest_abort_ = (ifarg(3) && strcmp(gargstr(3), "abort") == 0);
194  }
195  size_t size = digest.size() ? digest[0].size() : 0;
196  digest.clear(); // in any case, start over.
197  digest.resize(nrn_nthread);
198  digest_cnt.clear();
199  digest_cnt.resize(nrn_nthread);
200  hoc_ret();
201  hoc_pushx(double(size));
202 }
203 
204 void nrn_digest_dbl_array(const char* msg, int tid, double t, double* array, size_t sz) {
205  if (!nrn_digest_) {
206  return;
207  }
208  unsigned char md[SHA_DIGEST_LENGTH];
209  size_t n = sz * sizeof(double);
210  unsigned char* d = (unsigned char*) array;
211  SHA1(d, n, md);
212 
213  std::string s(msg);
214  char buf[100];
215  int ix = int(digest_cnt[tid]);
216  digest_cnt[tid]++;
217  sprintf(buf, " %d %d %.17g ", tid, ix, t);
218  s += buf;
219 
220  for (int i = 0; i < 8; ++i) {
221  sprintf(buf, "%02x", (int) md[i]);
222  s += buf;
223  }
224 
225  digest[tid].push_back(s);
226 
227  if (nrn_digest_print_item_ == ix && nrn_digest_print_tid_ == tid) {
228  printf("ZZ %s\n", s.c_str());
229  if (nrn_digest_abort_) {
230  abort();
231  }
232  for (size_t i = 0; i < sz; ++i) {
233  printf("Z %zd %.20g\n", i, array[i]);
234  }
235  }
236 }
237 
238 #endif // NRN_DIGEST
void rangevareval(void)
Definition: cabcode.cpp:1373
void sec_access_pop(void)
Definition: cabcode.cpp:164
void rangevarevalpointer()
Definition: cabcode.cpp:1339
void mech_access(void)
Definition: cabcode.cpp:846
void range_const()
Definition: cabcode.cpp:1014
void range_interpolate(void)
Definition: cabcode.cpp:1138
void add_section(void)
Definition: cabcode.cpp:205
void forall_section(void)
Definition: cabcode.cpp:1963
void mech_uninsert(void)
Definition: cabcode.cpp:892
void connectsection(void)
Definition: cabcode.cpp:673
void sec_access(void)
Definition: cabcode.cpp:720
void connectpointer()
Definition: cabcode.cpp:1084
void range_interpolate_single(void)
Definition: cabcode.cpp:1097
void sec_access_push(void)
Definition: cabcode.cpp:749
void sec_access_object(void)
Definition: cabcode.cpp:732
void hoc_ifsec(void)
Definition: cabcode.cpp:2036
void ob_sec_access()
Definition: cabcode.cpp:834
void rangepoint(void)
Definition: cabcode.cpp:1382
char * gargstr(int narg)
Definition: code2.cpp:227
void hoc_pushzero()
Definition: code.cpp:989
void hoc_argref(void)
Definition: code.cpp:1730
void hoc_arg()
Definition: code.cpp:1656
void hoc_and()
Definition: code.cpp:2127
void hoc_prexpr()
Definition: code.cpp:2381
void hoc_power()
Definition: code.cpp:2150
void hoc_ge(void)
Definition: code.cpp:2055
void hoc_Break(void)
Definition: code.cpp:1298
void hoc_Stop(void)
Definition: code.cpp:1308
void hoc_cyclic(void)
Definition: code.cpp:2007
void hoc_ne()
Definition: code.cpp:2099
void hoc_delete_symbol(void)
Definition: code.cpp:2422
void hoc_argassign(void)
Definition: code.cpp:1692
void hoc_varpush()
Definition: code.cpp:994
void hoc_gt(void)
Definition: code.cpp:2039
void hoc_prstr(void)
Definition: code.cpp:2409
void hoc_iterator_stmt()
Definition: code.cpp:1130
void hoc_div(void)
Definition: code.cpp:1996
void hoc_eq()
Definition: code.cpp:2071
void hoc_shortfor(void)
Definition: code.cpp:1030
void hocobjret(void)
Definition: code.cpp:1544
void hoc_assign()
Definition: code.cpp:2159
void hoc_lt()
Definition: code.cpp:2047
void hoc_evalpointer()
Definition: code.cpp:1903
void hoc_bltin(void)
Definition: code.cpp:1760
void hoc_eval(void)
Definition: code.cpp:1827
void hoc_mul(void)
Definition: code.cpp:1987
void hoc_varread(void)
Definition: code.cpp:2451
void hoc_ifcode(void)
Definition: code.cpp:1284
void hoc_add(void)
Definition: code.cpp:1969
void hoc_argrefasgn(void)
Definition: code.cpp:1709
void hoc_constpush()
Definition: code.cpp:984
void hoc_stringarg(void)
Definition: code.cpp:1664
void hoc_procret(void)
Definition: code.cpp:1533
void hoc_forcode(void)
Definition: code.cpp:1000
void hoc_sub(void)
Definition: code.cpp:1978
void hoc_Continue(void)
Definition: code.cpp:1303
Inst * hoc_prog
Definition: code.cpp:76
void hoc_iterator(void)
Definition: code.cpp:1087
void for_segment(void)
Definition: code.cpp:1270
void hoc_negate()
Definition: code.cpp:2034
void hoc_newline(void)
Definition: code.cpp:2446
void hoc_assstr(void)
Definition: code.cpp:2272
void hoc_not(void)
Definition: code.cpp:2142
void hoc_print()
Definition: code.cpp:2374
void hoc_or(void)
Definition: code.cpp:2134
void hoc_le(void)
Definition: code.cpp:2063
void hoc_funcret(void)
Definition: code.cpp:1523
void hoc_object_asgn(void)
void hoc_newobj(void)
Definition: hoc_oop.cpp:586
void hoc_asgn_obj_to_str(void)
void hoc_constobject(void)
Definition: hoc_oop.cpp:840
void hoc_cmp_otype(void)
void hoc_object_eval(void)
Definition: hoc_oop.cpp:1341
void hoc_objvardecl(void)
void hoc_ob_pointer(void)
void connect_obsec_syntax(void)
Definition: hoc_oop.cpp:969
void hoc_push_current_object(void)
void hoc_objectarg(void)
void hoc_known_type(void)
Definition: hoc_oop.cpp:788
#define i
Definition: md1redef.h:19
void debugzz(Inst *p)
Definition: debug.cpp:32
int hoc_zzdebug
Definition: debug.cpp:19
void hoc_debug(void)
Definition: debug.cpp:23
#define prcod(c1, c2)
Definition: debug.cpp:21
void hoc_dep_make(void)
Definition: nonlin.cpp:21
void hoc_eqn_init(void)
void hoc_eqn_name(void)
void hoc_eqn_lhs(void)
void hoc_eqn_rhs(void)
double chkarg(int, double low, double high)
Definition: code2.cpp:626
char buf[512]
Definition: init.cpp:13
void hoc_execerr_ext(const char *fmt,...)
printf style specification of hoc_execerror message.
Definition: fileio.cpp:828
void hoc_ret()
int hoc_is_str_arg(int narg)
Definition: code.cpp:872
void hoc_nopop()
Definition: code.cpp:972
#define STOP
Definition: hocdec.h:57
void hoc_pushx(double)
Definition: code.cpp:779
printf
Definition: extdef.h:5
int nrn_nthread
Definition: multicore.cpp:55
if(ncell==0)
Definition: cellorder.cpp:785
void simpleconnectsection()
Definition: cabcode.cpp:664
int const size_t const size_t n
Definition: nrngsl.h:10
size_t p
s
Definition: multisend.cpp:521
int ifarg(int)
Definition: code.cpp:1607
void hoc_objectvar()
Definition: hoc_oop.cpp:792
void hoc_call()
Definition: code.cpp:1398
void hoc_push_string()
Definition: code.cpp:805
void hoc_object_component()
Definition: hoc_oop.cpp:977
void nrn_cppp(void)
Definition: point.cpp:295
void connect_point_process_pointer(void)
Definition: point.cpp:299
void hoc_ifseclist()
Definition: seclist.cpp:320
void forall_sectionlist()
Definition: seclist.cpp:276
Definition: hocdec.h:42
int Printf(const char *fmt, Args... args)
Definition: logger.hpp:18