summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFrank Ch. Eigler <fche@elastic.org>2008-04-28 14:01:50 -0400
committerFrank Ch. Eigler <fche@elastic.org>2008-06-23 17:41:39 -0400
commit1a0dbc5a7ff6ec220b9b4b150ce5cfb6c035d1f5 (patch)
treeed0446ecc8e629ed398494b89cd964da612fcb4f
parenta8368458b976929634935d66202d27927e3c2ed9 (diff)
downloadsystemtap-steved-1a0dbc5a7ff6ec220b9b4b150ce5cfb6c035d1f5.tar.gz
systemtap-steved-1a0dbc5a7ff6ec220b9b4b150ce5cfb6c035d1f5.tar.xz
systemtap-steved-1a0dbc5a7ff6ec220b9b4b150ce5cfb6c035d1f5.zip
populate sess.unwindsym_modules set from dwarf probes
-rw-r--r--main.cxx9
-rw-r--r--session.h2
-rw-r--r--tapsets.cxx3
-rw-r--r--translate.cxx123
4 files changed, 55 insertions, 82 deletions
diff --git a/main.cxx b/main.cxx
index 45b154ac..23ab3b2f 100644
--- a/main.cxx
+++ b/main.cxx
@@ -111,8 +111,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
@@ -446,7 +449,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':
diff --git a/session.h b/session.h
index 2b61a85f..d8d89091 100644
--- a/session.h
+++ b/session.h
@@ -165,8 +165,8 @@ struct systemtap_session
Dwarf_Addr sym_stext;
// List of libdwfl module names to extract symbol/unwind data for.
- std::vector<std::string> unwindsym_modules;
struct module_cache* module_cache;
+ std::set<std::string> unwindsym_modules;
std::set<std::string> seen_errors;
std::set<std::string> seen_warnings;
diff --git a/tapsets.cxx b/tapsets.cxx
index 7db0fc0a..7dd7cf27 100644
--- a/tapsets.cxx
+++ b/tapsets.cxx
@@ -3145,6 +3145,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);
@@ -3191,7 +3192,6 @@ dwarf_query::assess_dbinfo_reqt()
}
-
// 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.
@@ -4732,6 +4732,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 2c1cb84c..84361eec 100644
--- a/translate.cxx
+++ b/translate.cxx
@@ -4359,16 +4359,29 @@ 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)
{
- static char debuginfo_path_arr[] = "-:.debug:/usr/lib/debug:build";
+ 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");
static char *debuginfo_path = (debuginfo_env_arr ?
debuginfo_env_arr : debuginfo_path_arr);
- static const char *debug_path = (debuginfo_env_arr ?
- debuginfo_env_arr : s.kernel_release.c_str());
static const Dwfl_Callbacks kernel_callbacks =
{
@@ -4378,75 +4391,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,
- debug_path,
- 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";
}
@@ -4612,16 +4581,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;