2 // Copyright (C) 2010-2011 Red Hat Inc.
4 // This file is part of systemtap, and is free software. You can
5 // redistribute it and/or modify it under the terms of the GNU General
6 // Public License (GPL); either version 2, or (at your option) any
12 #include "elaborate.h"
13 #include "translate.h"
15 #include "coveragedb.h"
17 #include "task_finder.h"
19 #include "rpm_finder.h"
21 #include "git_version.h"
31 #include <sys/utsname.h>
32 #include <elfutils/libdwfl.h>
45 /* getopt variables */
48 #define PATH_TBD string("__TBD__")
50 bool systemtap_session::NSPR_Initialized
= false;
52 systemtap_session::systemtap_session ():
53 // NB: pointer members must be manually initialized!
55 pattern_root(new match_node
),
58 dwarf_derived_probes(0),
59 kprobe_derived_probes(0),
60 hwbkpt_derived_probes(0),
61 perf_derived_probes(0),
62 uprobe_derived_probes(0),
63 utrace_derived_probes(0),
64 itrace_derived_probes(0),
65 task_finder_derived_probes(0),
66 timer_derived_probes(0),
67 profile_derived_probes(0),
68 mark_derived_probes(0),
69 tracepoint_derived_probes(0),
70 hrtimer_derived_probes(0),
71 procfs_derived_probes(0),
73 sym_kprobes_text_start (0),
74 sym_kprobes_text_end (0),
81 kernel_release
= string (buf
.release
);
82 release
= kernel_release
;
83 kernel_build_tree
= "/lib/modules/" + kernel_release
+ "/build";
84 architecture
= machine
= normalize_machine(buf
.machine
);
86 for (unsigned i
=0; i
<5; i
++) perpass_verbose
[i
]=0;
90 runtime_specified
= false;
91 include_arg_start
= -1;
96 suppress_warnings
= false;
97 panic_warnings
= false;
99 listing_mode_vars
= false;
101 #ifdef ENABLE_PROLOGUES
102 prologue_searching
= true;
104 prologue_searching
= false;
109 module_name
= "stap_" + lex_cast(getpid());
110 stapconf_name
= "stapconf_" + lex_cast(getpid()) + ".h";
111 output_file
= ""; // -o FILE
117 use_script_cache
= true;
118 poison_cache
= false;
119 tapset_compile_coverage
= false;
120 need_uprobes
= false;
122 consult_symtab
= false;
123 ignore_vmlinux
= false;
124 ignore_dwarf
= false;
126 skip_badvars
= false;
127 unprivileged
= false;
129 compatible
= VERSION
; // XXX: perhaps also process GIT_SHAID if available?
130 unwindsym_ldd
= false;
131 client_options
= false;
132 use_server_on_error
= true;
133 try_server_status
= try_server_unset
;
134 systemtap_v_check
= false;
136 /* adding in the XDG_DATA_DIRS variable path,
137 * this searches in conjunction with SYSTEMTAP_TAPSET
138 * to locate stap scripts, either can be disabled if
139 * needed using env $PATH=/dev/null where $PATH is the
140 * path you want disabled
142 const char* s_p1
= getenv ("XDG_DATA_DIRS");
146 tokenize(s_p1
, dirs
, ":");
147 for(vector
<string
>::iterator i
= dirs
.begin(); i
!= dirs
.end(); ++i
)
149 include_path
.push_back(*i
+ "/systemtap/tapset");
153 const char* s_p
= getenv ("SYSTEMTAP_TAPSET");
156 include_path
.push_back (s_p
);
160 include_path
.push_back (string(PKGDATADIR
) + "/tapset");
163 const char* s_r
= getenv ("SYSTEMTAP_RUNTIME");
167 runtime_path
= string(PKGDATADIR
) + "/runtime";
169 const char* s_d
= getenv ("SYSTEMTAP_DIR");
173 data_path
= get_home_directory() + string("/.systemtap");
174 if (create_dir(data_path
.c_str()) == 1)
176 const char* e
= strerror (errno
);
177 if (! suppress_warnings
)
178 cerr
<< "Warning: failed to create systemtap data directory (\""
179 << data_path
<< "\"): " << e
180 << ", disabling cache support." << endl
;
181 use_cache
= use_script_cache
= false;
186 cache_path
= data_path
+ "/cache";
187 if (create_dir(cache_path
.c_str()) == 1)
189 const char* e
= strerror (errno
);
190 if (! suppress_warnings
)
191 cerr
<< "Warning: failed to create cache directory (\""
192 << cache_path
<< "\"): " << e
193 << ", disabling cache support." << endl
;
194 use_cache
= use_script_cache
= false;
198 const char* s_tc
= getenv ("SYSTEMTAP_COVERAGE");
200 tapset_compile_coverage
= true;
202 const char* s_kr
= getenv ("SYSTEMTAP_RELEASE");
204 setup_kernel_release(s_kr
);
208 systemtap_session::~systemtap_session ()
210 delete_map(subsessions
);
214 systemtap_session::NSPR_init ()
217 if (! NSPR_Initialized
)
219 PR_Init (PR_SYSTEM_THREAD
, PR_PRIORITY_NORMAL
, 1);
220 NSPR_Initialized
= true;
226 systemtap_session::clone(const string
& arch
, const string
& release
)
228 if (this->architecture
== arch
&& this->kernel_release
== release
)
231 systemtap_session
*& s
= subsessions
[make_pair(arch
, release
)];
234 s
= new systemtap_session(*this);
235 s
->machine
= s
->architecture
= arch
;
236 s
->setup_kernel_release(release
.c_str());
242 systemtap_session::version ()
245 << "SystemTap translator/driver "
246 << "(version " << VERSION
<< "/" << dwfl_version (NULL
)
247 << " " << GIT_MESSAGE
<< ")" << endl
248 << "Copyright (C) 2005-2011 Red Hat, Inc. and others" << endl
249 << "This is free software; see the source for copying conditions." << endl
;
250 clog
<< "enabled features:"
257 #ifdef HAVE_LIBSQLITE3
263 #ifdef HAVE_BOOST_SHARED_PTR_HPP
264 << " BOOST_SHARED_PTR"
266 #ifdef HAVE_TR1_UNORDERED_MAP
267 << " TR1_UNORDERED_MAP"
269 #ifdef ENABLE_PROLOGUES
276 systemtap_session::usage (int exitcode
)
281 << "Usage: stap [options] FILE Run script in file."
283 << " or: stap [options] - Run script on stdin."
285 << " or: stap [options] -e SCRIPT Run given script."
287 << " or: stap [options] -l PROBE List matching probes."
289 << " or: stap [options] -L PROBE List matching probes and local variables."
292 << "Options:" << endl
293 << " -- end of translator options, script options follow" << endl
294 << " -h --help show help" << endl
295 << " -V show version" << endl
296 << " -p NUM stop after pass NUM 1-5, instead of " << last_pass
<< endl
297 << " (parse, elaborate, translate, compile, run)" << endl
298 << " -v add verbosity to all passes" << endl
299 << " --vp {N}+ add per-pass verbosity [";
300 for (unsigned i
=0; i
<5; i
++)
301 clog
<< (perpass_verbose
[i
] <= 9 ? perpass_verbose
[i
] : 9);
304 << " -k keep temporary directory" << endl
305 << " -u unoptimized translation" << (unoptimized
? " [set]" : "") << endl
306 << " -w suppress warnings" << (suppress_warnings
? " [set]" : "") << endl
307 << " -W turn warnings into errors" << (panic_warnings
? " [set]" : "") << endl
308 << " -g guru mode" << (guru_mode
? " [set]" : "") << endl
309 << " -P prologue-searching for function probes"
310 << (prologue_searching
? " [set]" : "") << endl
311 << " -b bulk (percpu file) mode" << (bulk_mode
? " [set]" : "") << endl
312 << " -s NUM buffer size in megabytes, instead of " << buffer_size
<< endl
313 << " -I DIR look in DIR for additional .stp script files";
314 if (include_path
.size() == 0)
317 clog
<< ", in addition to" << endl
;
318 for (unsigned i
=0; i
<include_path
.size(); i
++)
319 clog
<< " " << include_path
[i
] << endl
;
321 << " -D NM=VAL emit macro definition into generated C code" << endl
322 << " -B NM=VAL pass option to kbuild make" << endl
323 << " -G VAR=VAL set global variable to value" << endl
324 << " -R DIR look in DIR for runtime, instead of" << endl
325 << " " << runtime_path
<< endl
326 << " -r DIR cross-compile to kernel with given build tree; or else" << endl
327 << " -r RELEASE cross-compile to kernel /lib/modules/RELEASE/build, instead of" << endl
328 << " " << kernel_build_tree
<< endl
329 << " -a ARCH cross-compile to given architecture, instead of " << architecture
<< endl
330 << " -m MODULE set probe module name, instead of " << endl
331 << " " << module_name
<< endl
332 << " -o FILE send script output to file, instead of stdout. This supports" << endl
333 << " strftime(3) formats for FILE" << endl
334 << " -c CMD start the probes, run CMD, and exit when it finishes" << endl
335 << " -x PID sets target() to PID" << endl
336 << " -F run as on-file flight recorder with -o." << endl
337 << " run as on-memory flight recorder without -o." << endl
338 << " -S size[,n] set maximum of the size and the number of files." << endl
339 << " -d OBJECT add unwind/symbol data for OBJECT file";
340 if (unwindsym_modules
.size() == 0)
343 clog
<< ", in addition to" << endl
;
345 vector
<string
> syms (unwindsym_modules
.begin(), unwindsym_modules
.end());
346 for (unsigned i
=0; i
<syms
.size(); i
++)
347 clog
<< " " << syms
[i
] << endl
;
350 << " --ldd add unwind/symbol data for all referenced OBJECT files." << endl
351 << " --all-modules" << endl
352 << " add unwind/symbol data for all loaded kernel objects." << endl
353 << " -t collect probe timing information" << endl
354 #ifdef HAVE_LIBSQLITE3
355 << " -q generate information on tapset coverage" << endl
356 #endif /* HAVE_LIBSQLITE3 */
357 << " --unprivileged" << endl
358 << " restrict usage to features available to unprivileged users" << endl
359 #if 0 /* PR6864: disable temporarily; should merge with -d somehow */
360 << " --kelf make do with symbol table from vmlinux" << endl
361 << " --kmap[=FILE]" << endl
362 << " make do with symbol table from nm listing" << endl
364 // Formerly present --ignore-{vmlinux,dwarf} options are for testsuite use
365 // only, and don't belong in the eyesight of a plain user.
366 << " --compatible=VERSION" << endl
367 << " suppress incompatible language/tapset changes beyond VERSION," << endl
368 << " instead of " << compatible
<< endl
369 << " --check-version" << endl
370 << " displays warnings where a syntax element may be " << endl
371 << " version dependent" << endl
372 << " --skip-badvars" << endl
373 << " substitute zero for bad context $variables" << endl
374 << " --use-server[=SERVER-SPEC]" << endl
375 << " specify systemtap compile-servers" << endl
376 << " --list-servers[=PROPERTIES]" << endl
377 << " report on the status of the specified compile-servers" << endl
379 << " --trust-servers[=TRUST-SPEC]" << endl
380 << " add/revoke trust of specified compile-servers" << endl
381 << " --use-server-on-error[=yes/no]" << endl
382 << " retry compilation using a compile server upon compilation error" << endl
384 << " --remote=HOSTNAME" << endl
385 << " run pass 5 on the specified ssh host (EXPERIMENTAL)" << endl
390 struct tm
* t
= localtime (& now
);
391 if (t
&& t
->tm_mon
*3 + t
->tm_mday
*173 == 0xb6)
392 clog
<< morehelp
<< endl
;
398 systemtap_session::parse_cmdline (int argc
, char * const argv
[])
400 client_options_disallowed
= "";
406 // NB: when adding new options, consider very carefully whether they
407 // should be restricted from stap clients (after --client-options)!
408 #define LONG_OPT_KELF 1
409 #define LONG_OPT_KMAP 2
410 #define LONG_OPT_IGNORE_VMLINUX 3
411 #define LONG_OPT_IGNORE_DWARF 4
412 #define LONG_OPT_VERBOSE_PASS 5
413 #define LONG_OPT_SKIP_BADVARS 6
414 #define LONG_OPT_UNPRIVILEGED 7
415 #define LONG_OPT_OMIT_WERROR 8
416 #define LONG_OPT_CLIENT_OPTIONS 9
417 #define LONG_OPT_HELP 10
418 #define LONG_OPT_DISABLE_CACHE 11
419 #define LONG_OPT_POISON_CACHE 12
420 #define LONG_OPT_CLEAN_CACHE 13
421 #define LONG_OPT_COMPATIBLE 14
422 #define LONG_OPT_LDD 15
423 #define LONG_OPT_USE_SERVER 16
424 #define LONG_OPT_LIST_SERVERS 17
425 #define LONG_OPT_TRUST_SERVERS 18
426 #define LONG_OPT_ALL_MODULES 19
427 #define LONG_OPT_REMOTE 20
428 #define LONG_OPT_CHECK_VERSION 21
429 #define LONG_OPT_USE_SERVER_ON_ERROR 22
430 // NB: also see find_hash(), usage(), switch stmt below, stap.1 man page
431 static struct option long_options
[] = {
432 { "kelf", 0, &long_opt
, LONG_OPT_KELF
},
433 { "kmap", 2, &long_opt
, LONG_OPT_KMAP
},
434 { "ignore-vmlinux", 0, &long_opt
, LONG_OPT_IGNORE_VMLINUX
},
435 { "ignore-dwarf", 0, &long_opt
, LONG_OPT_IGNORE_DWARF
},
436 { "skip-badvars", 0, &long_opt
, LONG_OPT_SKIP_BADVARS
},
437 { "vp", 1, &long_opt
, LONG_OPT_VERBOSE_PASS
},
438 { "unprivileged", 0, &long_opt
, LONG_OPT_UNPRIVILEGED
},
445 { OWE4 OWE6 OWE1 OWE2 OWE3 OWE5
, 0, &long_opt
, LONG_OPT_OMIT_WERROR
},
446 { "client-options", 0, &long_opt
, LONG_OPT_CLIENT_OPTIONS
},
447 { "help", 0, &long_opt
, LONG_OPT_HELP
},
448 { "disable-cache", 0, &long_opt
, LONG_OPT_DISABLE_CACHE
},
449 { "poison-cache", 0, &long_opt
, LONG_OPT_POISON_CACHE
},
450 { "clean-cache", 0, &long_opt
, LONG_OPT_CLEAN_CACHE
},
451 { "compatible", 1, &long_opt
, LONG_OPT_COMPATIBLE
},
452 { "ldd", 0, &long_opt
, LONG_OPT_LDD
},
453 { "use-server", 2, &long_opt
, LONG_OPT_USE_SERVER
},
454 { "list-servers", 2, &long_opt
, LONG_OPT_LIST_SERVERS
},
455 { "trust-servers", 2, &long_opt
, LONG_OPT_TRUST_SERVERS
},
456 { "use-server-on-error", 2, &long_opt
, LONG_OPT_USE_SERVER_ON_ERROR
},
457 { "all-modules", 0, &long_opt
, LONG_OPT_ALL_MODULES
},
458 { "remote", 1, &long_opt
, LONG_OPT_REMOTE
},
459 { "check-version", 0, &long_opt
, LONG_OPT_CHECK_VERSION
},
462 int grc
= getopt_long (argc
, argv
, "hVvtp:I:e:o:R:r:a:m:kgPc:x:D:bs:uqwl:d:L:FS:B:WG:",
464 // NB: when adding new options, consider very carefully whether they
465 // should be restricted from stap clients (after --client-options)!
469 bool push_server_opt
= false;
473 push_server_opt
= true;
478 push_server_opt
= true;
479 for (unsigned i
=0; i
<5; i
++)
480 perpass_verbose
[i
] ++;
485 // Make sure the global option is only composed of the
486 // following chars: [_=a-zA-Z0-9]
487 assert_regexp_match("-G parameter", optarg
, "^[a-z_][a-z0-9_]+=[a-z0-9_-]+$");
489 globalopts
.push_back (string(optarg
));
493 push_server_opt
= true;
498 push_server_opt
= true;
499 suppress_warnings
= true;
503 push_server_opt
= true;
504 panic_warnings
= true;
508 last_pass
= (int)strtoul(optarg
, &num_endptr
, 10);
509 if (*num_endptr
!= '\0' || last_pass
< 1 || last_pass
> 5)
511 cerr
<< "Invalid pass number (should be 1-5)." << endl
;
514 if (listing_mode
&& last_pass
!= 2)
516 cerr
<< "Listing (-l) mode implies pass 2." << endl
;
519 push_server_opt
= true;
524 client_options_disallowed
+= client_options_disallowed
.empty () ? "-I" : ", -I";
525 if (include_arg_start
== -1)
526 include_arg_start
= include_path
.size ();
527 include_path
.push_back (string (optarg
));
531 push_server_opt
= true;
533 // At runtime user module names are resolved through their
534 // canonical (absolute) path.
535 const char *mpath
= canonicalize_file_name (optarg
);
536 if (mpath
== NULL
) // Must be a kernel module name
538 unwindsym_modules
.insert (string (mpath
));
539 // PR10228: trigger vma tracker logic early if -d /USER-MODULE/
540 // given. XXX This is actually too early. Having a user module
541 // is a good indicator that something will need vma tracking.
542 // But it is not 100%, this really should only trigger through
543 // a user mode tapset /* pragma:vma */ or a probe doing a
544 // variable lookup through a dynamic module.
546 enable_vma_tracker (*this);
553 cerr
<< "Only one script can be given on the command line."
557 push_server_opt
= true;
558 cmdline_script
= string (optarg
);
563 // NB: client_options not a problem, since pass 1-4 does not use output_file.
564 push_server_opt
= true;
565 output_file
= string (optarg
);
569 if (client_options
) { cerr
<< "ERROR: -R invalid with --client-options" << endl
; return 1; }
570 runtime_specified
= true;
571 runtime_path
= string (optarg
);
576 client_options_disallowed
+= client_options_disallowed
.empty () ? "-m" : ", -m";
577 module_name
= string (optarg
);
580 // If the module name ends with '.ko', chop it off since
581 // modutils doesn't like modules named 'foo.ko.ko'.
582 if (endswith(module_name
, ".ko"))
584 module_name
.erase(module_name
.size() - 3);
585 cerr
<< "Truncating module name to '" << module_name
589 // Make sure an empty module name wasn't specified (-m "")
590 if (module_name
.empty())
592 cerr
<< "Module name cannot be empty." << endl
;
596 // Make sure the module name is only composed of the
597 // following chars: [a-z0-9_]
598 assert_regexp_match("-m parameter", module_name
, "^[a-z0-9_]+$");
600 // Make sure module name isn't too long.
601 if (module_name
.size() >= (MODULE_NAME_LEN
- 1))
603 module_name
.resize(MODULE_NAME_LEN
- 1);
604 cerr
<< "Truncating module name to '" << module_name
609 push_server_opt
= true;
610 use_script_cache
= false;
614 if (client_options
) // NB: no paths!
615 assert_regexp_match("-r parameter from client", optarg
, "^[a-z0-9_.-]+$");
616 push_server_opt
= true;
617 setup_kernel_release(optarg
);
621 assert_regexp_match("-a parameter", optarg
, "^[a-z0-9_-]+$");
622 push_server_opt
= true;
623 architecture
= string(optarg
);
627 push_server_opt
= true;
629 use_script_cache
= false; /* User wants to keep a usable build tree. */
633 push_server_opt
= true;
638 push_server_opt
= true;
639 prologue_searching
= true;
643 push_server_opt
= true;
648 push_server_opt
= true;
653 buffer_size
= (int) strtoul (optarg
, &num_endptr
, 10);
654 if (*num_endptr
!= '\0' || buffer_size
< 1 || buffer_size
> 4095)
656 cerr
<< "Invalid buffer size (should be 1-4095)." << endl
;
659 push_server_opt
= true;
663 push_server_opt
= true;
664 cmd
= string (optarg
);
667 // This would mess with later code deciding to pass -c
668 // through to staprun
669 cerr
<< "Empty CMD string invalid." << endl
;
675 target_pid
= (int) strtoul(optarg
, &num_endptr
, 10);
676 if (*num_endptr
!= '\0')
678 cerr
<< "Invalid target process ID number." << endl
;
681 push_server_opt
= true;
685 assert_regexp_match ("-D parameter", optarg
, "^[a-z_][a-z_0-9]*(=-?[a-z_0-9]+)?$");
687 client_options_disallowed
+= client_options_disallowed
.empty () ? "-D" : ", -D";
688 push_server_opt
= true;
689 macros
.push_back (string (optarg
));
693 assert_regexp_match ("-S parameter", optarg
, "^[0-9]+(,[0-9]+)?$");
694 push_server_opt
= true;
695 size_option
= string (optarg
);
699 if (client_options
) { cerr
<< "ERROR: -q invalid with --client-options" << endl
; return 1; }
700 push_server_opt
= true;
701 tapset_compile_coverage
= true;
709 listing_mode_vars
= true;
710 unoptimized
= true; // This causes retention of variables for listing_mode
713 suppress_warnings
= true;
718 cerr
<< "Only one script can be given on the command line."
722 push_server_opt
= true;
723 cmdline_script
= string("probe ") + string(optarg
) + " {}";
728 push_server_opt
= true;
733 if (client_options
) { cerr
<< "ERROR: -B invalid with --client-options" << endl
; return 1; }
734 push_server_opt
= true;
735 kbuildflags
.push_back (string (optarg
));
742 push_server_opt
= true;
743 consult_symtab
= true;
746 // Leave consult_symtab unset for now, to ease error checking.
747 if (!kernel_symtab_path
.empty())
749 cerr
<< "You can't specify multiple --kmap options." << endl
;
752 push_server_opt
= true;
754 kernel_symtab_path
= optarg
;
756 kernel_symtab_path
= PATH_TBD
;
758 case LONG_OPT_IGNORE_VMLINUX
:
759 push_server_opt
= true;
760 ignore_vmlinux
= true;
762 case LONG_OPT_IGNORE_DWARF
:
763 push_server_opt
= true;
766 case LONG_OPT_VERBOSE_PASS
:
769 if (strlen(optarg
) < 1 || strlen(optarg
) > 5)
772 for (unsigned i
=0; i
<strlen(optarg
); i
++)
773 if (isdigit (optarg
[i
]))
774 perpass_verbose
[i
] += optarg
[i
]-'0';
780 cerr
<< "Invalid --vp argument: it takes 1 to 5 digits." << endl
;
783 // NB: we don't do this: last_pass = strlen(optarg);
784 push_server_opt
= true;
787 case LONG_OPT_SKIP_BADVARS
:
788 push_server_opt
= true;
791 case LONG_OPT_UNPRIVILEGED
:
792 push_server_opt
= true;
794 /* NB: for server security, it is essential that once this flag is
795 set, no future flag be able to unset it. */
797 case LONG_OPT_OMIT_WERROR
:
798 push_server_opt
= true;
801 case LONG_OPT_CLIENT_OPTIONS
:
802 client_options
= true;
804 case LONG_OPT_USE_SERVER
:
806 client_options_disallowed
+= client_options_disallowed
.empty () ? "--use-server" : ", --use-server";
808 specified_servers
.push_back (optarg
);
810 specified_servers
.push_back ("");
812 case LONG_OPT_USE_SERVER_ON_ERROR
:
814 client_options_disallowed
+= client_options_disallowed
.empty () ? "--use-server-on-error" : ", --use-server-on-error";
818 for (unsigned i
= 0; i
< arg
.size (); ++i
)
819 arg
[i
] = tolower (arg
[i
]);
820 if (arg
== "yes" || arg
== "ye" || arg
== "y")
821 use_server_on_error
= true;
822 else if (arg
== "no" || arg
== "n")
823 use_server_on_error
= false;
825 cerr
<< "Invalid argument '" << optarg
<< "' for --use-server-on-error." << endl
;
828 use_server_on_error
= true;
830 case LONG_OPT_LIST_SERVERS
:
832 client_options_disallowed
+= client_options_disallowed
.empty () ? "--list-servers" : ", --list-servers";
834 server_status_strings
.push_back (optarg
);
836 server_status_strings
.push_back ("");
838 case LONG_OPT_TRUST_SERVERS
:
840 client_options_disallowed
+= client_options_disallowed
.empty () ? "--trust-servers" : ", --trust-servers";
842 server_trust_spec
= optarg
;
844 server_trust_spec
= "ssl";
850 // The caching options should not be available to server clients
851 case LONG_OPT_DISABLE_CACHE
:
852 if (client_options
) {
853 cerr
<< "ERROR: --disable-cache is invalid with --client-options" << endl
;
856 use_cache
= use_script_cache
= false;
858 case LONG_OPT_POISON_CACHE
:
859 if (client_options
) {
860 cerr
<< "ERROR: --poison-cache is invalid with --client-options" << endl
;
865 case LONG_OPT_CLEAN_CACHE
:
866 if (client_options
) {
867 cerr
<< "ERROR: --clean-cache is invalid with --client-options" << endl
;
873 case LONG_OPT_COMPATIBLE
:
874 push_server_opt
= true;
879 if (client_options
) {
880 cerr
<< "ERROR: --ldd is invalid with --client-options" << endl
;
883 push_server_opt
= true;
884 unwindsym_ldd
= true;
887 case LONG_OPT_ALL_MODULES
:
888 if (client_options
) {
889 cerr
<< "ERROR: --all-modules is invalid with --client-options" << endl
;
892 insert_loaded_modules();
895 case LONG_OPT_REMOTE
:
896 if (client_options
) {
897 cerr
<< "ERROR: --remote is invalid with --client-options" << endl
;
901 remote_uris
.push_back(optarg
);
904 case LONG_OPT_CHECK_VERSION
:
905 push_server_opt
= true;
906 systemtap_v_check
= true;
910 // NOTREACHED unless one added a getopt option but not a corresponding switch/case:
911 cerr
<< "Unhandled long argument id " << long_opt
<< endl
;
917 // Invalid/unrecognized option given or argument required, but
918 // not given. In both cases getopt_long() will have printed the
919 // appropriate error message to stderr already.
924 // NOTREACHED unless one added a getopt option but not a corresponding switch/case:
925 cerr
<< "Unhandled argument code " << (char)grc
<< endl
;
930 // Pass selected options on to the server, if any.
934 server_args
.push_back (string ("--") +
935 long_options
[long_opt
- 1].name
);
937 server_args
.push_back (string ("-") + (char)grc
);
939 server_args
.push_back (optarg
);
947 systemtap_session::check_options (int argc
, char * const argv
[])
949 for (int i
= optind
; i
< argc
; i
++)
953 script_file
= string (argv
[i
]);
957 args
.push_back (string (argv
[i
]));
961 // NB: this is also triggered if stap is invoked with no arguments at all
964 // We don't need a script if --list-servers or --trust-servers was specified
965 if (server_status_strings
.empty () && server_trust_spec
.empty ())
967 cerr
<< "A script must be specified." << endl
;
974 cerr
<< "WARNING: --client-options is not supported by this version of systemtap" << endl
;
978 if (! server_trust_spec
.empty ())
980 cerr
<< "WARNING: --trust-servers is not supported by this version of systemtap" << endl
;
981 server_trust_spec
.clear ();
985 if (runtime_specified
&& ! specified_servers
.empty ())
987 cerr
<< "Warning: Ignoring --use-server due to the use of -R" << endl
;
988 specified_servers
.clear ();
991 if (client_options
&& last_pass
> 4)
993 last_pass
= 4; /* Quietly downgrade. Server passed through -p5 naively. */
996 // If phase 5 has been requested and the user is a member of stapusr but not
997 // stapdev, then add --unprivileged and --use-server to the invocation,
998 // if not already specified.
999 // XXX Eventually we could check remote hosts, but disable that case for now.
1000 if (last_pass
> 4 && have_script
&& remote_uris
.empty())
1002 struct group
*stgr
= getgrnam ("stapusr");
1003 if (stgr
&& in_group_id (stgr
->gr_gid
))
1005 stgr
= getgrnam ("stapdev");
1006 if (! stgr
|| ! in_group_id (stgr
->gr_gid
))
1010 if (perpass_verbose
[0] > 1)
1011 cerr
<< "Using --unprivileged for member of the group stapusr" << endl
;
1012 unprivileged
= true;
1013 server_args
.push_back ("--unprivileged");
1015 if (specified_servers
.empty ())
1017 if (perpass_verbose
[0] > 1)
1018 cerr
<< "Using --use-server for member of the group stapusr" << endl
;
1019 specified_servers
.push_back ("");
1025 if (client_options
&& unprivileged
&& ! client_options_disallowed
.empty ())
1027 cerr
<< "You can't specify " << client_options_disallowed
<< " when --unprivileged is specified." << endl
;
1030 if ((cmd
!= "") && (target_pid
))
1032 cerr
<< "You can't specify -c and -x options together." << endl
;
1035 if (unprivileged
&& guru_mode
)
1037 cerr
<< "You can't specify -g and --unprivileged together." << endl
;
1040 if (!kernel_symtab_path
.empty())
1044 cerr
<< "You can't specify --kelf and --kmap together." << endl
;
1047 consult_symtab
= true;
1048 if (kernel_symtab_path
== PATH_TBD
)
1049 kernel_symtab_path
= string("/boot/System.map-") + kernel_release
;
1051 // Warn in case the target kernel release doesn't match the running one.
1052 if (last_pass
> 4 &&
1053 (release
!= kernel_release
||
1054 machine
!= architecture
)) // NB: squashed ARCH by PR4186 logic
1056 if(! suppress_warnings
)
1057 cerr
<< "WARNING: kernel release/architecture mismatch with host forces last-pass 4." << endl
;
1061 // translate path of runtime to absolute path
1062 if (runtime_path
[0] != '/')
1065 if (getcwd(cwd
, sizeof(cwd
)))
1067 runtime_path
= string(cwd
) + "/" + runtime_path
;
1074 systemtap_session::init_try_server ()
1077 // If the option is disabled or we are a server or we are already using a
1078 // server, then never retry compilation using a server.
1079 if (! use_server_on_error
|| client_options
|| ! specified_servers
.empty ())
1080 try_server_status
= dont_try_server
;
1082 try_server_status
= try_server_unset
;
1084 // No client, so don't bother.
1085 try_server_status
= dont_try_server
;
1090 systemtap_session::set_try_server (int t
)
1092 if (try_server_status
!= dont_try_server
)
1093 try_server_status
= t
;
1097 void systemtap_session::insert_loaded_modules()
1100 ifstream
procmods ("/proc/modules");
1101 while (procmods
.good()) {
1102 procmods
.getline (line
, sizeof(line
));
1103 strtok(line
, " \t");
1104 if (line
[0] == '\0')
1105 break; // maybe print a warning?
1106 unwindsym_modules
.insert (string (line
));
1109 unwindsym_modules
.insert ("kernel");
1113 systemtap_session::setup_kernel_release (const char* kstr
)
1115 if (kstr
[0] == '/') // fully specified path
1117 kernel_build_tree
= kstr
;
1118 string version_file_name
= kernel_build_tree
+ "/include/config/kernel.release";
1119 // The file include/config/kernel.release within the
1120 // build tree is used to pull out the version information
1121 ifstream
version_file (version_file_name
.c_str());
1122 if (version_file
.fail ())
1124 cerr
<< "Missing " << version_file_name
<< endl
;
1130 kernel_release
= "";
1131 while (version_file
.get(c
) && c
!= '\n')
1132 kernel_release
.push_back(c
);
1136 // Maybe it's a full kernel source tree, for purposes of PR10745.
1137 // In case CONFIG_DEBUG_INFO was set, we'd find it anyway with the
1138 // normal search in tapsets.cxx. Without CONFIG_DEBUG_INFO, we'd
1139 // need heuristics such as this one:
1141 string some_random_source_only_file
= kernel_build_tree
+ "/COPYING";
1142 ifstream
epic (some_random_source_only_file
.c_str());
1145 kernel_source_tree
= kernel_build_tree
;
1147 clog
<< "Located kernel source tree (COPYING) at '"
1148 << kernel_source_tree
<< "'" << endl
;
1153 kernel_release
= string (kstr
);
1154 kernel_build_tree
= "/lib/modules/" + kernel_release
+ "/build";
1157 // Let's not look for the kernel_source_tree; it's definitely
1158 // not THERE. tapsets.cxx might try to find it later if tracepoints
1164 // Register all the aliases we've seen in library files, and the user
1165 // file, as patterns.
1167 systemtap_session::register_library_aliases()
1169 vector
<stapfile
*> files(library_files
);
1170 files
.push_back(user_file
);
1172 for (unsigned f
= 0; f
< files
.size(); ++f
)
1174 stapfile
* file
= files
[f
];
1175 for (unsigned a
= 0; a
< file
->aliases
.size(); ++a
)
1177 probe_alias
* alias
= file
->aliases
[a
];
1180 for (unsigned n
= 0; n
< alias
->alias_names
.size(); ++n
)
1182 probe_point
* name
= alias
->alias_names
[n
];
1183 match_node
* n
= pattern_root
;
1184 for (unsigned c
= 0; c
< name
->components
.size(); ++c
)
1186 probe_point::component
* comp
= name
->components
[c
];
1187 // XXX: alias parameters
1189 throw semantic_error("alias component "
1191 + " contains illegal parameter");
1192 n
= n
->bind(comp
->functor
);
1194 n
->bind(new alias_expansion_builder(alias
));
1197 catch (const semantic_error
& e
)
1199 semantic_error
* er
= new semantic_error (e
); // copy it
1202 msg
<< " while registering probe alias ";
1203 alias
->printsig(msg
);
1204 er
->msg2
= msg
.str();
1213 // Print this given token, but abbreviate it if the last one had the
1216 systemtap_session::print_token (ostream
& o
, const token
* tok
)
1220 if (last_token
&& last_token
->location
.file
== tok
->location
.file
)
1224 string ts
= tmpo
.str();
1225 // search & replace the file name with nothing
1226 size_t idx
= ts
.find (tok
->location
.file
->name
);
1227 if (idx
!= string::npos
)
1228 ts
.replace (idx
, tok
->location
.file
->name
.size(), "");
1241 systemtap_session::print_error (const semantic_error
& e
)
1243 string message_str
[2];
1244 string
align_semantic_error (" ");
1246 // We generate two messages. The second one ([1]) is printed
1247 // without token compression, for purposes of duplicate elimination.
1248 // This way, the same message that may be generated once with a
1249 // compressed and once with an uncompressed token still only gets
1251 for (int i
=0; i
<2; i
++)
1253 stringstream message
;
1255 message
<< "semantic error: " << e
.what ();
1256 if (e
.tok1
|| e
.tok2
)
1260 if (i
== 0) print_token (message
, e
.tok1
);
1261 else message
<< *e
.tok1
;
1266 if (i
== 0) print_token (message
, e
.tok2
);
1267 else message
<< *e
.tok2
;
1270 message_str
[i
] = message
.str();
1273 // Duplicate elimination
1274 if (seen_errors
.find (message_str
[1]) == seen_errors
.end())
1276 seen_errors
.insert (message_str
[1]);
1277 cerr
<< message_str
[0];
1280 print_error_source (cerr
, align_semantic_error
, e
.tok1
);
1283 print_error_source (cerr
, align_semantic_error
, e
.tok2
);
1287 print_error (* e
.chain
);
1291 systemtap_session::print_error_source (std::ostream
& message
,
1292 std::string
& align
, const token
* tok
)
1297 if (!tok
->location
.file
)
1298 //No source to print, silently exit
1301 unsigned line
= tok
->location
.line
;
1302 unsigned col
= tok
->location
.column
;
1303 const string
&file_contents
= tok
->location
.file
->file_contents
;
1305 size_t start_pos
= 0, end_pos
= 0;
1306 //Navigate to the appropriate line
1307 while (i
!= line
&& end_pos
!= std::string::npos
)
1309 start_pos
= end_pos
;
1310 end_pos
= file_contents
.find ('\n', start_pos
) + 1;
1313 message
<< align
<< "source: " << file_contents
.substr (start_pos
, end_pos
-start_pos
-1) << endl
;
1314 message
<< align
<< " ";
1315 //Navigate to the appropriate column
1316 for (i
=start_pos
; i
<start_pos
+col
-1; i
++)
1318 if(isspace(file_contents
[i
]))
1319 message
<< file_contents
[i
];
1323 message
<< "^" << endl
;
1327 systemtap_session::print_warning (const string
& message_str
, const token
* tok
)
1329 // Duplicate elimination
1330 string
align_warning (" ");
1331 if (seen_warnings
.find (message_str
) == seen_warnings
.end())
1333 seen_warnings
.insert (message_str
);
1334 clog
<< "WARNING: " << message_str
;
1335 if (tok
) { clog
<< ": "; print_token (clog
, tok
); }
1337 if (tok
) { print_error_source (clog
, align_warning
, tok
); }
1341 // --------------------------------------------------------------------------
1344 Perngrq sebz fzvyrlgnc.fit, rkcbegrq gb n 1484k1110 fzvyrlgnc.cat,
1345 gurapr catgbcnz | cazfpnyr -jvqgu 160 |
1346 cczqvgure -qvz 4 -erq 2 -terra 2 -oyhr 2 | cczgbnafv -2k4 | bq -i -j19 -g k1 |
1347 phg -s2- -q' ' | frq -r 'f,^,\\k,' -r 'f, ,\\k,t' -r 'f,^,",' -r 'f,$,",'
1350 systemtap_session::morehelp
=
1351 "\x1b\x5b\x30\x6d\x1b\x5b\x33\x37\x6d\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20"
1352 "\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20"
1353 "\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20"
1354 "\x20\x20\x20\x60\x20\x20\x2e\x60\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20"
1355 "\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20"
1356 "\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20"
1357 "\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20"
1358 "\x20\x20\x60\x20\x60\x20\x60\x20\x60\x20\x60\x20\x60\x20\x60\x20\x60\x1b\x5b"
1359 "\x33\x33\x6d\x20\x1b\x5b\x33\x37\x6d\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20"
1360 "\x20\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20"
1361 "\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20"
1362 "\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x1b\x5b\x33\x33\x6d\x20\x60"
1363 "\x2e\x60\x1b\x5b\x33\x37\x6d\x20\x3a\x2c\x3a\x2e\x60\x20\x60\x20\x60\x20\x60"
1364 "\x2c\x3b\x2c\x3a\x20\x1b\x5b\x33\x33\x6d\x60\x2e\x60\x20\x1b\x5b\x33\x37\x6d"
1365 "\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20"
1366 "\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20"
1367 "\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x1b\x5b\x33"
1368 "\x33\x6d\x20\x60\x20\x60\x20\x3a\x27\x60\x1b\x5b\x33\x37\x6d\x20\x60\x60\x60"
1369 "\x20\x20\x20\x60\x20\x60\x60\x60\x20\x1b\x5b\x33\x33\x6d\x60\x3a\x60\x20\x60"
1370 "\x20\x60\x20\x1b\x5b\x33\x37\x6d\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20"
1371 "\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20"
1372 "\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20"
1373 "\x20\x2e\x1b\x5b\x33\x33\x6d\x60\x2e\x60\x20\x60\x20\x60\x20\x20\x1b\x5b\x33"
1374 "\x37\x6d\x20\x3a\x20\x20\x20\x60\x20\x20\x20\x60\x20\x20\x2e\x1b\x5b\x33\x33"
1375 "\x6d\x60\x20\x60\x2e\x60\x20\x60\x2e\x60\x20\x1b\x5b\x33\x37\x6d\x20\x20\x20"
1376 "\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x2e\x3a\x20\x20"
1377 "\x20\x20\x20\x20\x20\x20\x2e\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20"
1378 "\x20\x20\x2e\x76\x53\x1b\x5b\x33\x34\x6d\x53\x1b\x5b\x33\x37\x6d\x53\x1b\x5b"
1379 "\x33\x31\x6d\x2b\x1b\x5b\x33\x33\x6d\x60\x20\x60\x20\x60\x20\x20\x20\x20\x1b"
1380 "\x5b\x33\x31\x6d\x3f\x1b\x5b\x33\x30\x6d\x53\x1b\x5b\x33\x33\x6d\x2b\x1b\x5b"
1381 "\x33\x37\x6d\x20\x20\x20\x20\x20\x20\x20\x2e\x1b\x5b\x33\x30\x6d\x24\x1b\x5b"
1382 "\x33\x37\x6d\x3b\x1b\x5b\x33\x31\x6d\x7c\x1b\x5b\x33\x33\x6d\x20\x60\x20\x60"
1383 "\x20\x60\x20\x60\x1b\x5b\x33\x31\x6d\x2c\x1b\x5b\x33\x32\x6d\x53\x1b\x5b\x33"
1384 "\x37\x6d\x53\x53\x3e\x2c\x2e\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x2e"
1385 "\x3b\x27\x20\x20\x20\x20\x20\x20\x20\x20\x20\x60\x3c\x20\x20\x20\x20\x20\x20"
1386 "\x20\x20\x20\x2e\x2e\x3a\x1b\x5b\x33\x30\x6d\x26\x46\x46\x46\x48\x46\x1b\x5b"
1387 "\x33\x33\x6d\x60\x2e\x60\x20\x60\x20\x60\x20\x60\x1b\x5b\x33\x30\x6d\x4d\x4d"
1388 "\x46\x1b\x5b\x33\x33\x6d\x20\x20\x1b\x5b\x33\x37\x6d\x20\x20\x20\x20\x1b\x5b"
1389 "\x33\x33\x6d\x20\x3a\x1b\x5b\x33\x30\x6d\x4d\x4d\x46\x1b\x5b\x33\x33\x6d\x20"
1390 "\x20\x20\x60\x20\x60\x2e\x60\x1b\x5b\x33\x31\x6d\x3c\x1b\x5b\x33\x30\x6d\x46"
1391 "\x46\x46\x24\x53\x46\x1b\x5b\x33\x37\x6d\x20\x20\x20\x20\x20\x0a\x20\x20\x20"
1392 "\x20\x2e\x3c\x3a\x60\x20\x20\x20\x20\x2e\x3a\x2e\x3a\x2e\x2e\x3b\x27\x20\x20"
1393 "\x20\x20\x20\x20\x2e\x60\x2e\x3a\x60\x60\x3c\x27\x1b\x5b\x33\x31\x6d\x3c\x27"
1394 "\x1b\x5b\x33\x33\x6d\x20\x60\x20\x60\x20\x60\x20\x20\x20\x60\x3c\x1b\x5b\x33"
1395 "\x30\x6d\x26\x1b\x5b\x33\x31\x6d\x3f\x1b\x5b\x33\x33\x6d\x20\x1b\x5b\x33\x37"
1396 "\x6d\x20\x1b\x5b\x33\x33\x6d\x20\x20\x20\x20\x20\x1b\x5b\x33\x37\x6d\x60\x1b"
1397 "\x5b\x33\x30\x6d\x2a\x46\x1b\x5b\x33\x37\x6d\x27\x1b\x5b\x33\x33\x6d\x20\x60"
1398 "\x20\x60\x20\x60\x20\x60\x20\x1b\x5b\x33\x31\x6d\x60\x3a\x1b\x5b\x33\x37\x6d"
1399 "\x27\x3c\x1b\x5b\x33\x30\x6d\x23\x1b\x5b\x33\x37\x6d\x3c\x60\x3a\x20\x20\x20"
1400 "\x0a\x20\x20\x20\x20\x3a\x60\x3a\x60\x20\x20\x20\x60\x3a\x2e\x2e\x2e\x2e\x3c"
1401 "\x3c\x20\x20\x20\x20\x20\x20\x3a\x2e\x60\x3a\x60\x20\x20\x20\x60\x1b\x5b\x33"
1402 "\x33\x6d\x3a\x1b\x5b\x33\x31\x6d\x60\x1b\x5b\x33\x33\x6d\x20\x60\x2e\x60\x20"
1403 "\x60\x20\x60\x20\x60\x20\x60\x1b\x5b\x33\x37\x6d\x20\x20\x1b\x5b\x33\x33\x6d"
1404 "\x20\x60\x20\x20\x20\x60\x1b\x5b\x33\x37\x6d\x20\x60\x20\x60\x1b\x5b\x33\x33"
1405 "\x6d\x20\x60\x2e\x60\x20\x60\x2e\x60\x20\x60\x3a\x1b\x5b\x33\x37\x6d\x20\x20"
1406 "\x20\x60\x3a\x2e\x60\x2e\x20\x0a\x20\x20\x20\x60\x3a\x60\x3a\x60\x20\x20\x20"
1407 "\x20\x20\x60\x60\x60\x60\x20\x3a\x2d\x20\x20\x20\x20\x20\x60\x20\x60\x20\x20"
1408 "\x20\x20\x20\x60\x1b\x5b\x33\x33\x6d\x3a\x60\x2e\x60\x20\x60\x20\x60\x20\x60"
1409 "\x20\x60\x20\x20\x2e\x3b\x1b\x5b\x33\x31\x6d\x76\x1b\x5b\x33\x30\x6d\x24\x24"
1410 "\x24\x1b\x5b\x33\x31\x6d\x2b\x53\x1b\x5b\x33\x33\x6d\x2c\x60\x20\x60\x20\x60"
1411 "\x20\x60\x20\x60\x20\x60\x2e\x1b\x5b\x33\x31\x6d\x60\x1b\x5b\x33\x33\x6d\x3a"
1412 "\x1b\x5b\x33\x37\x6d\x20\x20\x20\x20\x60\x2e\x60\x20\x20\x0a\x20\x20\x20\x60"
1413 "\x3a\x3a\x3a\x3a\x20\x20\x20\x20\x3a\x60\x60\x60\x60\x3a\x53\x20\x20\x20\x20"
1414 "\x20\x20\x3a\x2e\x60\x2e\x20\x20\x20\x20\x20\x1b\x5b\x33\x33\x6d\x3a\x1b\x5b"
1415 "\x33\x31\x6d\x3a\x1b\x5b\x33\x33\x6d\x2e\x60\x2e\x60\x20\x60\x2e\x60\x20\x60"
1416 "\x20\x3a\x1b\x5b\x33\x30\x6d\x24\x46\x46\x48\x46\x46\x46\x46\x46\x1b\x5b\x33"
1417 "\x31\x6d\x53\x1b\x5b\x33\x33\x6d\x2e\x60\x20\x60\x2e\x60\x20\x60\x2e\x60\x2e"
1418 "\x1b\x5b\x33\x31\x6d\x3a\x1b\x5b\x33\x33\x6d\x3a\x1b\x5b\x33\x37\x6d\x20\x20"
1419 "\x20\x2e\x60\x2e\x3a\x20\x20\x0a\x20\x20\x20\x60\x3a\x3a\x3a\x60\x20\x20\x20"
1420 "\x60\x3a\x20\x2e\x20\x3b\x27\x3a\x20\x20\x20\x20\x20\x20\x3a\x2e\x60\x3a\x20"
1421 "\x20\x20\x20\x20\x3a\x1b\x5b\x33\x33\x6d\x3c\x3a\x1b\x5b\x33\x31\x6d\x60\x1b"
1422 "\x5b\x33\x33\x6d\x2e\x60\x20\x60\x20\x60\x20\x60\x2e\x1b\x5b\x33\x30\x6d\x53"
1423 "\x46\x46\x46\x53\x46\x46\x46\x53\x46\x46\x1b\x5b\x33\x33\x6d\x20\x60\x20\x60"
1424 "\x20\x60\x2e\x60\x2e\x60\x3a\x1b\x5b\x33\x31\x6d\x3c\x1b\x5b\x33\x37\x6d\x20"
1425 "\x20\x20\x20\x3a\x60\x3a\x60\x20\x20\x0a\x20\x20\x20\x20\x60\x3c\x3b\x3c\x20"
1426 "\x20\x20\x20\x20\x60\x60\x60\x20\x3a\x3a\x20\x20\x20\x20\x20\x20\x20\x3a\x3a"
1427 "\x2e\x60\x20\x20\x20\x20\x20\x3a\x1b\x5b\x33\x33\x6d\x3b\x1b\x5b\x33\x31\x6d"
1428 "\x3c\x3a\x60\x1b\x5b\x33\x33\x6d\x2e\x60\x2e\x60\x20\x60\x3a\x1b\x5b\x33\x30"
1429 "\x6d\x53\x46\x53\x46\x46\x46\x53\x46\x46\x46\x53\x1b\x5b\x33\x33\x6d\x2e\x60"
1430 "\x20\x60\x2e\x60\x2e\x60\x3a\x1b\x5b\x33\x31\x6d\x3c\x1b\x5b\x33\x33\x6d\x3b"
1431 "\x1b\x5b\x33\x37\x6d\x27\x20\x20\x20\x60\x3a\x3a\x60\x20\x20\x20\x0a\x20\x20"
1432 "\x20\x20\x20\x60\x3b\x3c\x20\x20\x20\x20\x20\x20\x20\x3a\x3b\x60\x20\x20\x20"
1433 "\x20\x20\x20\x20\x20\x20\x60\x3a\x60\x2e\x20\x20\x20\x20\x20\x3a\x1b\x5b\x33"
1434 "\x33\x6d\x3c\x3b\x1b\x5b\x33\x31\x6d\x3c\x1b\x5b\x33\x33\x6d\x3a\x1b\x5b\x33"
1435 "\x31\x6d\x3a\x1b\x5b\x33\x33\x6d\x2e\x60\x2e\x60\x20\x1b\x5b\x33\x31\x6d\x3a"
1436 "\x1b\x5b\x33\x30\x6d\x46\x53\x46\x53\x46\x53\x46\x53\x46\x1b\x5b\x33\x31\x6d"
1437 "\x3f\x1b\x5b\x33\x33\x6d\x20\x60\x2e\x60\x2e\x3a\x3a\x1b\x5b\x33\x31\x6d\x3c"
1438 "\x1b\x5b\x33\x33\x6d\x3b\x1b\x5b\x33\x31\x6d\x3c\x1b\x5b\x33\x37\x6d\x60\x20"
1439 "\x20\x20\x3a\x3a\x3a\x60\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x53\x3c"
1440 "\x20\x20\x20\x20\x20\x20\x3a\x53\x3a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20"
1441 "\x20\x60\x3a\x3a\x60\x2e\x20\x20\x20\x20\x60\x3a\x1b\x5b\x33\x31\x6d\x3c\x1b"
1442 "\x5b\x33\x33\x6d\x3b\x1b\x5b\x33\x31\x6d\x3c\x3b\x3c\x1b\x5b\x33\x33\x6d\x3a"
1443 "\x60\x2e\x60\x3c\x1b\x5b\x33\x30\x6d\x53\x46\x53\x24\x53\x46\x53\x24\x1b\x5b"
1444 "\x33\x33\x6d\x60\x3a\x1b\x5b\x33\x31\x6d\x3a\x1b\x5b\x33\x33\x6d\x3a\x1b\x5b"
1445 "\x33\x31\x6d\x3a\x3b\x3c\x1b\x5b\x33\x33\x6d\x3b\x1b\x5b\x33\x31\x6d\x3c\x1b"
1446 "\x5b\x33\x33\x6d\x3a\x1b\x5b\x33\x37\x6d\x60\x20\x20\x2e\x60\x3a\x3a\x60\x20"
1447 "\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x3b\x3c\x2e\x2e\x2c\x2e\x2e\x20"
1448 "\x3a\x3c\x3b\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x60\x3a\x3a\x3a"
1449 "\x60\x20\x20\x20\x20\x20\x60\x3a\x1b\x5b\x33\x33\x6d\x3c\x3b\x1b\x5b\x33\x31"
1450 "\x6d\x3c\x3b\x3c\x1b\x5b\x33\x33\x6d\x3b\x1b\x5b\x33\x31\x6d\x3c\x1b\x5b\x33"
1451 "\x33\x6d\x3b\x1b\x5b\x33\x31\x6d\x3c\x3c\x1b\x5b\x33\x30\x6d\x53\x24\x53\x1b"
1452 "\x5b\x33\x31\x6d\x53\x1b\x5b\x33\x37\x6d\x27\x1b\x5b\x33\x33\x6d\x2e\x3a\x3b"
1453 "\x1b\x5b\x33\x31\x6d\x3c\x3b\x3c\x1b\x5b\x33\x33\x6d\x3a\x1b\x5b\x33\x31\x6d"
1454 "\x3c\x1b\x5b\x33\x33\x6d\x3a\x1b\x5b\x33\x37\x6d\x60\x20\x20\x20\x60\x2e\x3a"
1455 "\x3a\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x2e\x3a\x3a\x3c\x53\x3c\x3a\x60"
1456 "\x3a\x3a\x3a\x3a\x53\x1b\x5b\x33\x32\x6d\x53\x1b\x5b\x33\x37\x6d\x3b\x27\x3a"
1457 "\x3c\x2c\x2e\x20\x20\x20\x20\x20\x20\x20\x20\x20\x60\x3a\x3a\x3a\x3a\x2e\x60"
1458 "\x2e\x60\x2e\x60\x3a\x1b\x5b\x33\x33\x6d\x3c\x3a\x1b\x5b\x33\x31\x6d\x3c\x1b"
1459 "\x5b\x33\x33\x6d\x53\x1b\x5b\x33\x31\x6d\x3c\x1b\x5b\x33\x33\x6d\x3b\x1b\x5b"
1460 "\x33\x31\x6d\x3c\x2c\x1b\x5b\x33\x33\x6d\x3c\x3b\x3a\x1b\x5b\x33\x31\x6d\x2c"
1461 "\x1b\x5b\x33\x33\x6d\x3c\x3b\x1b\x5b\x33\x31\x6d\x3c\x1b\x5b\x33\x33\x6d\x53"
1462 "\x1b\x5b\x33\x31\x6d\x3c\x1b\x5b\x33\x33\x6d\x3b\x3c\x1b\x5b\x33\x37\x6d\x3a"
1463 "\x60\x2e\x60\x2e\x3b\x1b\x5b\x33\x34\x6d\x53\x1b\x5b\x33\x37\x6d\x53\x3f\x27"
1464 "\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x2e\x60\x3a\x60\x3a\x3c\x53\x53\x3b\x3c"
1465 "\x3a\x60\x3a\x3a\x53\x53\x53\x3c\x3a\x60\x3a\x1b\x5b\x33\x30\x6d\x53\x1b\x5b"
1466 "\x33\x37\x6d\x2b\x20\x20\x20\x20\x20\x20\x60\x20\x20\x20\x3a\x1b\x5b\x33\x34"
1467 "\x6d\x53\x1b\x5b\x33\x30\x6d\x53\x46\x24\x1b\x5b\x33\x37\x6d\x2c\x60\x3a\x3a"
1468 "\x3a\x3c\x3a\x3c\x1b\x5b\x33\x33\x6d\x53\x1b\x5b\x33\x37\x6d\x3c\x1b\x5b\x33"
1469 "\x33\x6d\x53\x1b\x5b\x33\x31\x6d\x53\x1b\x5b\x33\x33\x6d\x3b\x1b\x5b\x33\x31"
1470 "\x6d\x53\x3b\x53\x1b\x5b\x33\x33\x6d\x3b\x1b\x5b\x33\x31\x6d\x53\x1b\x5b\x33"
1471 "\x33\x6d\x53\x1b\x5b\x33\x37\x6d\x3c\x1b\x5b\x33\x33\x6d\x53\x1b\x5b\x33\x37"
1472 "\x6d\x3c\x53\x3c\x3a\x3a\x3a\x3a\x3f\x1b\x5b\x33\x30\x6d\x53\x24\x48\x1b\x5b"
1473 "\x33\x37\x6d\x27\x60\x20\x60\x20\x20\x20\x20\x20\x20\x0a\x2e\x60\x3a\x60\x2e"
1474 "\x60\x3a\x60\x2e\x60\x3a\x60\x2e\x60\x3a\x60\x2e\x60\x3a\x60\x2e\x1b\x5b\x33"
1475 "\x30\x6d\x53\x46\x1b\x5b\x33\x37\x6d\x20\x20\x20\x20\x60\x20\x20\x20\x60\x20"
1476 "\x60\x3a\x1b\x5b\x33\x30\x6d\x3c\x46\x46\x46\x1b\x5b\x33\x37\x6d\x3f\x2e\x60"
1477 "\x3a\x60\x3a\x60\x3a\x60\x3a\x60\x3a\x3c\x3a\x60\x3a\x27\x3a\x60\x3a\x60\x3a"
1478 "\x60\x3a\x60\x3b\x1b\x5b\x33\x30\x6d\x53\x46\x48\x46\x1b\x5b\x33\x37\x6d\x27"
1479 "\x20\x60\x20\x60\x20\x60\x20\x20\x20\x20\x0a\x20\x3c\x3b\x3a\x2e\x60\x20\x60"
1480 "\x2e\x60\x20\x60\x2e\x60\x20\x60\x2e\x60\x2c\x53\x1b\x5b\x33\x32\x6d\x53\x1b"
1481 "\x5b\x33\x30\x6d\x53\x1b\x5b\x33\x37\x6d\x20\x20\x20\x20\x20\x20\x20\x20\x20"
1482 "\x20\x20\x60\x20\x60\x3c\x1b\x5b\x33\x30\x6d\x46\x46\x46\x1b\x5b\x33\x34\x6d"
1483 "\x2b\x1b\x5b\x33\x37\x6d\x3a\x20\x60\x20\x60\x20\x60\x2e\x60\x20\x60\x2e\x60"
1484 "\x20\x60\x2e\x60\x20\x60\x20\x60\x2c\x1b\x5b\x33\x30\x6d\x24\x46\x48\x46\x1b"
1485 "\x5b\x33\x37\x6d\x27\x20\x60\x20\x20\x20\x60\x20\x20\x20\x20\x20\x20\x0a\x20"
1486 "\x60\x3a\x1b\x5b\x33\x30\x6d\x53\x24\x1b\x5b\x33\x37\x6d\x53\x53\x53\x3b\x3c"
1487 "\x2c\x60\x2c\x3b\x3b\x53\x3f\x53\x1b\x5b\x33\x30\x6d\x24\x46\x3c\x1b\x5b\x33"
1488 "\x37\x6d\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x60\x20\x60"
1489 "\x3c\x1b\x5b\x33\x30\x6d\x48\x46\x46\x46\x1b\x5b\x33\x37\x6d\x3f\x2e\x60\x20"
1490 "\x60\x20\x60\x20\x60\x20\x60\x20\x60\x20\x60\x20\x3b\x76\x1b\x5b\x33\x30\x6d"
1491 "\x48\x46\x48\x46\x1b\x5b\x33\x37\x6d\x27\x20\x60\x20\x20\x20\x60\x20\x20\x20"
1492 "\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x60\x3c\x1b\x5b\x33\x30\x6d\x46\x24\x1b"
1493 "\x5b\x33\x37\x6d\x53\x53\x53\x53\x53\x53\x1b\x5b\x33\x30\x6d\x53\x24\x53\x46"
1494 "\x46\x46\x1b\x5b\x33\x37\x6d\x27\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20"
1495 "\x20\x20\x20\x20\x20\x20\x20\x20\x60\x3c\x1b\x5b\x33\x30\x6d\x23\x46\x46\x46"
1496 "\x24\x1b\x5b\x33\x37\x6d\x76\x2c\x2c\x20\x2e\x20\x2e\x20\x2c\x2c\x76\x1b\x5b"
1497 "\x33\x30\x6d\x26\x24\x46\x46\x48\x3c\x1b\x5b\x33\x37\x6d\x27\x20\x20\x20\x20"
1498 "\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x60"
1499 "\x3c\x1b\x5b\x33\x30\x6d\x53\x46\x46\x24\x46\x24\x46\x46\x48\x46\x53\x1b\x5b"
1500 "\x33\x37\x6d\x20\x20\x20\x20\x20\x20\x20\x20\x2e\x60\x20\x60\x2e\x60\x2e\x60"
1501 "\x2e\x60\x2e\x60\x3a\x3a\x3a\x3a\x3a\x1b\x5b\x33\x30\x6d\x2a\x46\x46\x46\x48"
1502 "\x46\x48\x46\x48\x46\x46\x46\x48\x46\x48\x46\x48\x1b\x5b\x33\x37\x6d\x3c\x22"
1503 "\x2e\x60\x2e\x60\x2e\x60\x2e\x60\x2e\x60\x20\x20\x20\x20\x20\x20\x20\x20\x0a"
1504 "\x20\x20\x20\x20\x20\x20\x20\x60\x3a\x1b\x5b\x33\x30\x6d\x48\x46\x46\x46\x48"
1505 "\x46\x46\x46\x1b\x5b\x33\x37\x6d\x27\x20\x20\x20\x60\x20\x60\x2e\x60\x20\x60"
1506 "\x2e\x60\x2e\x60\x3a\x60\x3a\x60\x3a\x60\x3a\x60\x3a\x3a\x3a\x60\x3a\x3c\x3c"
1507 "\x1b\x5b\x33\x30\x6d\x3c\x46\x48\x46\x46\x46\x48\x46\x46\x46\x1b\x5b\x33\x37"
1508 "\x6d\x27\x3a\x60\x3a\x60\x3a\x60\x3a\x60\x2e\x60\x2e\x60\x20\x60\x2e\x60\x20"
1509 "\x60\x20\x60\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x60\x22\x1b\x5b"
1510 "\x33\x30\x6d\x2a\x46\x48\x46\x1b\x5b\x33\x37\x6d\x3f\x20\x20\x20\x60\x20\x60"
1511 "\x2e\x60\x20\x60\x2e\x60\x2e\x60\x3a\x60\x2e\x60\x3a\x60\x3a\x60\x3a\x60\x3a"
1512 "\x60\x3a\x60\x3a\x60\x3a\x60\x3a\x1b\x5b\x33\x30\x6d\x46\x46\x48\x46\x48\x46"
1513 "\x1b\x5b\x33\x37\x6d\x27\x3a\x60\x3a\x60\x3a\x60\x3a\x60\x2e\x60\x3a\x60\x2e"
1514 "\x60\x2e\x60\x20\x60\x2e\x60\x20\x60\x20\x60\x0a\x20\x20\x20\x20\x20\x20\x20"
1515 "\x20\x20\x20\x20\x60\x3c\x1b\x5b\x33\x30\x6d\x48\x46\x46\x1b\x5b\x33\x37\x6d"
1516 "\x2b\x60\x20\x20\x20\x60\x20\x60\x20\x60\x20\x60\x20\x60\x20\x60\x2e\x60\x20"
1517 "\x60\x2e\x60\x20\x60\x2e\x60\x20\x60\x3a\x60\x2e\x60\x3b\x1b\x5b\x33\x30\x6d"
1518 "\x48\x46\x46\x46\x1b\x5b\x33\x37\x6d\x27\x2e\x60\x2e\x60\x20\x60\x2e\x60\x20"
1519 "\x60\x2e\x60\x20\x60\x20\x60\x20\x60\x20\x60\x20\x20\x20\x60\x20\x20\x0a\x20"
1520 "\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x22\x1b\x5b\x33\x30\x6d\x3c"
1521 "\x48\x46\x53\x1b\x5b\x33\x37\x6d\x2b\x3a\x20\x20\x20\x60\x20\x60\x20\x60\x20"
1522 "\x60\x20\x60\x20\x60\x20\x60\x20\x60\x20\x60\x20\x60\x20\x60\x20\x60\x2c\x1b"
1523 "\x5b\x33\x30\x6d\x24\x46\x48\x46\x1b\x5b\x33\x37\x6d\x3f\x20\x60\x20\x60\x20"
1524 "\x60\x20\x60\x20\x60\x20\x60\x20\x60\x20\x60\x20\x60\x20\x60\x20\x20\x20\x60"
1525 "\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20"
1526 "\x60\x22\x3c\x1b\x5b\x33\x30\x6d\x48\x24\x46\x46\x1b\x5b\x33\x37\x6d\x3e\x2c"
1527 "\x2e\x2e\x20\x20\x20\x20\x20\x20\x20\x20\x60\x20\x20\x20\x60\x20\x20\x20\x3b"
1528 "\x2c\x2c\x1b\x5b\x33\x30\x6d\x24\x53\x46\x46\x46\x1b\x5b\x33\x37\x6d\x27\x22"
1529 "\x20\x20\x60\x20\x20\x20\x60\x20\x20\x20\x60\x20\x20\x20\x20\x20\x20\x20\x20"
1530 "\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20"
1531 "\x20\x20\x20\x20\x20\x20\x20\x20\x20\x60\x22\x1b\x5b\x33\x30\x6d\x2a\x3c\x48"
1532 "\x46\x46\x24\x53\x24\x1b\x5b\x33\x37\x6d\x53\x53\x53\x3e\x3e\x3e\x3e\x3e\x53"
1533 "\x3e\x53\x1b\x5b\x33\x30\x6d\x24\x53\x24\x46\x24\x48\x46\x23\x1b\x5b\x33\x37"
1534 "\x6d\x27\x22\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20"
1535 "\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20"
1536 "\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20"
1537 "\x60\x60\x22\x3c\x1b\x5b\x33\x30\x6d\x2a\x3c\x3c\x3c\x48\x46\x46\x46\x48\x46"
1538 "\x46\x46\x23\x3c\x1b\x5b\x33\x36\x6d\x3c\x1b\x5b\x33\x37\x6d\x3c\x27\x22\x22"
1539 "\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20"
1540 "\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x1b"
1543 /* vim: set sw=2 ts=8 cino=>4,n-2,{2,^-2,t0,(0,u0,w1,M1 : */