diff options
author | Frank Ch. Eigler <fche@elastic.org> | 2008-04-28 14:01:50 -0400 |
---|---|---|
committer | Frank Ch. Eigler <fche@elastic.org> | 2008-04-28 14:01:50 -0400 |
commit | be1b875ec567a8947da5893c09ad71478a4b50a9 (patch) | |
tree | 4f34c1023a06fecd5e46d32ae86039806b0e3b82 | |
parent | f98a02cee66ba983187058e3b09a0a712fbe2277 (diff) | |
download | systemtap-steved-be1b875ec567a8947da5893c09ad71478a4b50a9.tar.gz systemtap-steved-be1b875ec567a8947da5893c09ad71478a4b50a9.tar.xz systemtap-steved-be1b875ec567a8947da5893c09ad71478a4b50a9.zip |
populate sess.unwindsym_modules set from dwarf probes
-rw-r--r-- | main.cxx | 9 | ||||
-rw-r--r-- | session.h | 4 | ||||
-rw-r--r-- | tapsets.cxx | 3 | ||||
-rw-r--r-- | translate.cxx | 119 |
4 files changed, 55 insertions, 80 deletions
@@ -109,8 +109,11 @@ usage (systemtap_session& s, int exitcode) clog << endl; else clog << ", in addition to" << endl; - for (unsigned i=0; i<s.unwindsym_modules.size(); i++) - clog << " " << s.unwindsym_modules[i] << endl; + { + vector<string> syms (s.unwindsym_modules.begin(), s.unwindsym_modules.end()); + for (unsigned i=0; i<syms.size(); i++) + clog << " " << syms[i] << endl; + } clog << " -t collect probe timing information" << endl #ifdef HAVE_LIBSQLITE3 @@ -398,7 +401,7 @@ main (int argc, char * const argv []) break; case 'd': - s.unwindsym_modules.push_back (string (optarg)); + s.unwindsym_modules.insert (string (optarg)); break; case 'e': @@ -1,5 +1,5 @@ // -*- C++ -*- -// Copyright (C) 2005-2007 Red Hat Inc. +// Copyright (C) 2005-2008 Red Hat Inc. // // This file is part of systemtap, and is free software. You can // redistribute it and/or modify it under the terms of the GNU General @@ -157,7 +157,7 @@ struct systemtap_session Dwarf_Addr sym_stext; // List of libdwfl module names to extract symbol/unwind data for. - std::vector<std::string> unwindsym_modules; + std::set<std::string> unwindsym_modules; std::set<std::string> seen_errors; unsigned num_errors () { return seen_errors.size(); } diff --git a/tapsets.cxx b/tapsets.cxx index c10196e2..522c1f94 100644 --- a/tapsets.cxx +++ b/tapsets.cxx @@ -2764,6 +2764,7 @@ dwarf_query::add_probe_point(const string& funcname, if (! bad) { + sess.unwindsym_modules.insert (module); probe = new dwarf_derived_probe(funcname, filename, line, module, reloc_section, addr, reloc_addr, *this, scope_die); results.push_back(probe); @@ -2772,7 +2773,6 @@ dwarf_query::add_probe_point(const string& funcname, - // The critical determining factor when interpreting a pattern // string is, perhaps surprisingly: "presence of a lineno". The // presence of a lineno changes the search strategy completely. @@ -4263,6 +4263,7 @@ dwarf_builder::build(systemtap_session & sess, q.statement_num_val, q.statement_num_val, q, 0); finished_results.push_back (p); + sess.unwindsym_modules.insert ("kernel"); return; } diff --git a/translate.cxx b/translate.cxx index 1b812ec1..e24673b6 100644 --- a/translate.cxx +++ b/translate.cxx @@ -4394,9 +4394,24 @@ get_symbols (Dwfl_Module *m, return DWARF_CB_OK; } -int -emit_symbol_data_from_debuginfo(systemtap_session& s, ofstream& kallsyms_out) + +void +emit_symbol_data (systemtap_session& s) { + ofstream kallsyms_out ((s.tmpdir + "/stap-symbols.h").c_str()); + s.op->newline() << "\n\n#include \"stap-symbols.h\""; + + if (s.verbose > 1) + { + std::set<std::string>::iterator it = s.unwindsym_modules.begin(); + clog << "unwindsym modules: "; + while (it != s.unwindsym_modules.end()) + { + clog << *(it++) << " "; + } + clog << endl; + } + static char debuginfo_path_arr[] = "-:.debug:/usr/lib/debug"; static char *debuginfo_env_arr = getenv("SYSTEMTAP_DEBUGINFO_PATH"); @@ -4411,75 +4426,31 @@ emit_symbol_data_from_debuginfo(systemtap_session& s, ofstream& kallsyms_out) & debuginfo_path }; - Dwfl *dwfl = dwfl_begin (&kernel_callbacks); - if (!dwfl) - throw semantic_error ("cannot open dwfl"); - dwfl_report_begin (dwfl); - - int rc = dwfl_linux_kernel_report_offline (dwfl, - s.kernel_release.c_str(), - kernel_filter); - dwfl_report_end (dwfl, NULL, NULL); - if (rc < 0) - return rc; - - dwfl_getmodules (dwfl, &get_symbols, NULL, 0); - dwfl_end(dwfl); - - int i = 0; - map< Dwarf_Addr, string>::iterator pos; - kallsyms_out << "struct _stp_symbol _stp_kernel_symbols [] = {"; - for (pos = addrmap.begin(); pos != addrmap.end(); pos++) { - kallsyms_out << " { 0x" << hex << pos->first << ", " << "\"" << pos->second << "\" },\n"; - i++; - } - - kallsyms_out << "};\n"; - kallsyms_out << "unsigned _stp_num_kernel_symbols = " << dec << i << ";\n"; - return i == 0; -} - -int -emit_symbol_data (systemtap_session& s) -{ - unsigned i=0; - char kallsyms_outbuf [4096]; - ofstream kallsyms_out ((s.tmpdir + "/stap-symbols.h").c_str()); - kallsyms_out.rdbuf()->pubsetbuf (kallsyms_outbuf, - sizeof(kallsyms_outbuf)); - s.op->newline() << "\n\n#include \"stap-symbols.h\""; - - // FIXME for non-debuginfo use. - if (true) { - return emit_symbol_data_from_debuginfo(s, kallsyms_out); - } else { - // For symbol-table only operation, we don't have debuginfo, - // so parse /proc/kallsyms. - - ifstream kallsyms("/proc/kallsyms"); - string lastaddr, modules_op_addr; - - kallsyms_out << "struct _stp_symbol _stp_kernel_symbols [] = {"; - while (! kallsyms.eof()) - { - string addr, type, sym; - kallsyms >> addr >> type >> sym >> ws; - - if (kallsyms.peek() == '[') - break; - - // NB: kallsyms includes some duplicate addresses - if ((type == "t" || type == "T" || type == "A" || sym == "modules_op") && lastaddr != addr) - { - kallsyms_out << " { 0x" << addr << ", " << "\"" << sym << "\" },\n"; - lastaddr = addr; - i ++; - } - } - kallsyms_out << "};\n"; - kallsyms_out << "unsigned _stp_num_kernel_symbols = " << i << ";\n"; + Dwfl *dwfl = dwfl_begin (&kernel_callbacks); + if (!dwfl) + throw semantic_error ("cannot open dwfl"); + dwfl_report_begin (dwfl); + + int rc = dwfl_linux_kernel_report_offline (dwfl, + s.kernel_release.c_str(), + kernel_filter); + dwfl_report_end (dwfl, NULL, NULL); + if (rc < 0) + throw semantic_error ("dwfl rc"); + + dwfl_getmodules (dwfl, &get_symbols, NULL, 0); + dwfl_end(dwfl); + + int i = 0; + map< Dwarf_Addr, string>::iterator pos; + kallsyms_out << "struct _stp_symbol _stp_kernel_symbols [] = {"; + for (pos = addrmap.begin(); pos != addrmap.end(); pos++) { + kallsyms_out << " { 0x" << hex << pos->first << ", " << "\"" << pos->second << "\" },\n"; + i++; } - return (i == 0); + + kallsyms_out << "};\n"; + kallsyms_out << "unsigned _stp_num_kernel_symbols = " << dec << i << ";\n"; } @@ -4645,16 +4616,16 @@ translate_pass (systemtap_session& s) s.up->emit_global_param (s.globals[i]); } - s.op->newline() << "MODULE_DESCRIPTION(\"systemtap probe\");"; - s.op->newline() << "MODULE_LICENSE(\"GPL\");"; // XXX + emit_symbol_data (s); + + s.op->newline() << "MODULE_DESCRIPTION(\"systemtap-generated probe\");"; + s.op->newline() << "MODULE_LICENSE(\"GPL\");"; } catch (const semantic_error& e) { s.print_error (e); } - rc |= emit_symbol_data (s); - s.op->line() << "\n"; delete s.op; |