diff options
author | Zdenek Prikryl <zdeny@dhcp-lab-218.englab.brq.redhat.com> | 2009-04-08 13:44:35 +0200 |
---|---|---|
committer | Zdenek Prikryl <zdeny@dhcp-lab-218.englab.brq.redhat.com> | 2009-04-08 13:44:35 +0200 |
commit | 234a905fe548f73f5e1df0db5b3490ae9b00a9d5 (patch) | |
tree | 70dca16dbb78da5925a626890442b687b04a4f80 | |
parent | 5c4a18fdd9795abaed59d3f5718d60cecde889ab (diff) | |
download | abrt-234a905fe548f73f5e1df0db5b3490ae9b00a9d5.tar.gz abrt-234a905fe548f73f5e1df0db5b3490ae9b00a9d5.tar.xz abrt-234a905fe548f73f5e1df0db5b3490ae9b00a9d5.zip |
renamed MW library
renamed Utils library
added check for plugins init method
renamed crash types
-rw-r--r-- | configure.ac | 4 | ||||
-rw-r--r-- | lib/CommLayer/Makefile.am | 4 | ||||
-rw-r--r-- | lib/MiddleWare/CrashTypes.h | 28 | ||||
-rw-r--r-- | lib/MiddleWare/Makefile.am | 12 | ||||
-rw-r--r-- | lib/MiddleWare/MiddleWare.cpp | 41 | ||||
-rw-r--r-- | lib/MiddleWare/PluginManager.cpp | 15 | ||||
-rw-r--r-- | lib/MiddleWare/test.cpp | 11 | ||||
-rw-r--r-- | lib/Plugins/CCpp.cpp | 160 | ||||
-rw-r--r-- | lib/Plugins/CCpp.h | 5 | ||||
-rw-r--r-- | lib/Plugins/Kerneloops.cpp | 5 | ||||
-rw-r--r-- | lib/Plugins/KerneloopsReporter.cpp | 4 | ||||
-rw-r--r-- | lib/Plugins/Makefile.am | 3 | ||||
-rw-r--r-- | lib/Utils/DebugDump.h | 5 | ||||
-rw-r--r-- | lib/Utils/Makefile.am | 8 | ||||
-rw-r--r-- | src/Daemon/CrashWatcher.cpp | 2 | ||||
-rw-r--r-- | src/Daemon/Makefile.am | 2 | ||||
-rw-r--r-- | src/Hooks/CCpp.cpp | 29 | ||||
-rw-r--r-- | src/Hooks/Makefile.am | 2 |
18 files changed, 227 insertions, 113 deletions
diff --git a/configure.ac b/configure.ac index 6e6ed410..6482a3bd 100644 --- a/configure.ac +++ b/configure.ac @@ -20,10 +20,14 @@ PKG_CHECK_MODULES([DBUSCPP], [dbus-c++-1]) PKG_CHECK_MODULES([RPM], [rpm]) PKG_CHECK_MODULES([CURL], [libcurl]) PKG_CHECK_MODULES([LIBNOTIFY], [libnotify]) +PKG_CHECK_MODULES([NSS], [nss]) AC_CHECK_HEADER([sys/inotify.h], [], [AC_MSG_ERROR([sys/inotify.h is needed to build abrt])]) +AC_CHECK_HEADER([magic.h], [], + [AC_MSG_ERROR([magic.h is needed to build abrt])]) + CONF_DIR='${sysconfdir}/${PACKAGE_NAME}' PLUGINS_CONF_DIR='${sysconfdir}/${PACKAGE_NAME}/plugins' PLUGINS_LIB_DIR='${libdir}/${PACKAGE_NAME}' diff --git a/lib/CommLayer/Makefile.am b/lib/CommLayer/Makefile.am index f9635b5d..2c9d23e6 100644 --- a/lib/CommLayer/Makefile.am +++ b/lib/CommLayer/Makefile.am @@ -4,7 +4,7 @@ libABRTCommLayer_la_SOURCES = CommLayerServer.h CommLayerServer.cpp \ CommLayerServerDBus.h CommLayerServerDBus.cpp \ DBusServerProxy.h Observer.h DBusCommon.h -libABRTCommLayer_la_LIBADD = ../../lib/MiddleWare/libMiddleWare.la $(DL_LIBS) $(DBUSCPP_LIBS) +libABRTCommLayer_la_LIBADD = ../../lib/MiddleWare/libABRTMiddleWare.la $(DL_LIBS) $(DBUSCPP_LIBS) libABRTCommLayer_la_LDFLAGS = -version-info 0:1:0 libABRTCommLayer_la_CPPFLAGS = -Wall -Werror -I../../lib/MiddleWare\ -I../../lib/DBus \ @@ -15,7 +15,7 @@ libABRTCommLayer_la_CPPFLAGS = -Wall -Werror -I../../lib/MiddleWare\ #check_PROGRAMS = test #test_SOURCES = test.cpp -#test_LDADD = ../Utils/libUtils.la libABRTCommLayer.la $(DL_LIBS) $(RPM_LIBS) +#test_LDADD = ../Utils/libABRTUtils.la libABRTCommLayer.la $(DL_LIBS) $(RPM_LIBS) #test_CPPFLAGS = -I$(srcdir)/../Utils \ # -DPLUGINS_LIB_DIR=\"$(PLUGINS_LIB_DIR)\" \ # -DPLUGINS_CONF_DIR=\"$(PLUGINS_CONF_DIR)\" \ diff --git a/lib/MiddleWare/CrashTypes.h b/lib/MiddleWare/CrashTypes.h index 69b5cd47..3dc3f4e8 100644 --- a/lib/MiddleWare/CrashTypes.h +++ b/lib/MiddleWare/CrashTypes.h @@ -19,18 +19,19 @@ #define CD_EDITABLE (1) #define CD_CONTENT (2) -#define CI_UUID "UUID" -#define CI_UID "UID" -#define CI_COUNT "Count" -#define CI_EXECUTABLE "Executable" -#define CI_PACKAGE "Package" -#define CI_DESCRIPTION "Description" -#define CI_TIME "Time" -#define CI_REPORTED "Reported" -#define CI_COMMENT "Comment" -#define CI_MWANALYZER "_MWAnalyzer" -#define CI_MWUID "_MWUID" -#define CI_MWUUID "_MWUUID" +#define CD_UUID "UUID" +#define CD_UID "UID" +#define CD_COUNT "Count" +#define CD_EXECUTABLE "Executable" +#define CD_PACKAGE "Package" +#define CD_DESCRIPTION "Description" +#define CD_TIME "Time" +#define CD_REPORTED "Reported" +#define CD_COMMENT "Comment" +#define CD_REPRODUCE "How to reproduce" +#define CD_MWANALYZER "_MWAnalyzer" +#define CD_MWUID "_MWUID" +#define CD_MWUUID "_MWUUID" // now, size of a vecor is always 3 -> <type, editable, content> typedef std::vector<std::string> vector_strings_t; @@ -43,10 +44,9 @@ typedef map_crash_data_t map_crash_report_t; inline void add_crash_data_to_crash_info(map_crash_info_t& pCrashInfo, const std::string& pItem, - const std::string& pType, const std::string& pContent) { - pCrashInfo[pItem].push_back(pType); + pCrashInfo[pItem].push_back(CD_TXT); pCrashInfo[pItem].push_back(CD_ISNOTEDITABLE); pCrashInfo[pItem].push_back(pContent); } diff --git a/lib/MiddleWare/Makefile.am b/lib/MiddleWare/Makefile.am index f5280eaf..1a35bcc0 100644 --- a/lib/MiddleWare/Makefile.am +++ b/lib/MiddleWare/Makefile.am @@ -1,18 +1,18 @@ -lib_LTLIBRARIES = libMiddleWare.la -libMiddleWare_la_SOURCES = MiddleWare.cpp MiddleWare.h PluginManager.cpp \ +lib_LTLIBRARIES = libABRTMiddleWare.la +libABRTMiddleWare_la_SOURCES = MiddleWare.cpp MiddleWare.h PluginManager.cpp \ PluginManager.h ABRTPlugin.cpp \ ABRTPlugin.h DynamicLibrary.cpp \ DynamicLibrary.h \ RPM.cpp RPM.h Plugin.h CrashTypes.h \ MiddleWareTypes.h Action.h Database.h \ Reporter.h Analyzer.h -libMiddleWare_la_LIBADD = $(DL_LIBS) ../Utils/libUtils.la $(RPM_LIBS) -libMiddleWare_la_LDFLAGS = -version-info 0:1:0 -libMiddleWare_la_CPPFLAGS = -I$(srcdir)/../Utils $(RPM_CFLAGS) +libABRTMiddleWare_la_LIBADD = $(DL_LIBS) ../Utils/libABRTUtils.la $(RPM_LIBS) +libABRTMiddleWare_la_LDFLAGS = -version-info 0:1:0 +libABRTMiddleWare_la_CPPFLAGS = -I$(srcdir)/../Utils $(RPM_CFLAGS) check_PROGRAMS = test test_SOURCES = test.cpp -test_LDADD = ../Utils/libUtils.la libMiddleWare.la $(DL_LIBS) $(RPM_LIBS) +test_LDADD = ../Utils/libABRTUtils.la libABRTMiddleWare.la $(DL_LIBS) $(RPM_LIBS) test_CPPFLAGS = -I$(srcdir)/../Utils \ -DPLUGINS_LIB_DIR=\"$(PLUGINS_LIB_DIR)\" \ -DPLUGINS_CONF_DIR=\"$(PLUGINS_CONF_DIR)\" \ diff --git a/lib/MiddleWare/MiddleWare.cpp b/lib/MiddleWare/MiddleWare.cpp index 29121db6..9d1fd433 100644 --- a/lib/MiddleWare/MiddleWare.cpp +++ b/lib/MiddleWare/MiddleWare.cpp @@ -75,7 +75,7 @@ void CMiddleWare::DebugDumpToCrashReport(const std::string& pDebugDumpDir, map_c { add_crash_data_to_crash_report(pCrashReport, fileName, CD_TXT, CD_ISNOTEDITABLE, content); } - else + else if (fileName != FILENAME_UID) { add_crash_data_to_crash_report(pCrashReport, fileName, CD_TXT, CD_ISEDITABLE, content); } @@ -115,7 +115,7 @@ void CMiddleWare::CreateReport(const std::string& pAnalyzer, CAnalyzer* analyzer = m_pPluginManager->GetAnalyzer(pAnalyzer); return analyzer->CreateReport(pDebugDumpDir); } - +#include <iostream> void CMiddleWare::CreateCrashReport(const std::string& pUUID, const std::string& pUID, map_crash_report_t& pCrashReport) @@ -154,23 +154,24 @@ void CMiddleWare::CreateCrashReport(const std::string& pUUID, RunAnalyzerActions(analyzer, row.m_sDebugDumpDir); DebugDumpToCrashReport(row.m_sDebugDumpDir, pCrashReport); - add_crash_data_to_crash_report(pCrashReport, CI_MWANALYZER, CD_SYS, CD_ISNOTEDITABLE, analyzer); - add_crash_data_to_crash_report(pCrashReport, CI_MWUID, CD_SYS, CD_ISNOTEDITABLE, pUID); - add_crash_data_to_crash_report(pCrashReport, CI_MWUUID, CD_SYS, CD_ISNOTEDITABLE, pUUID); - add_crash_data_to_crash_report(pCrashReport, CI_COMMENT, CD_TXT, CD_ISEDITABLE, ""); + add_crash_data_to_crash_report(pCrashReport, CD_MWANALYZER, CD_SYS, CD_ISNOTEDITABLE, analyzer); + add_crash_data_to_crash_report(pCrashReport, CD_MWUID, CD_SYS, CD_ISNOTEDITABLE, pUID); + add_crash_data_to_crash_report(pCrashReport, CD_MWUUID, CD_SYS, CD_ISNOTEDITABLE, pUUID); + add_crash_data_to_crash_report(pCrashReport, CD_COMMENT, CD_TXT, CD_ISEDITABLE, ""); + add_crash_data_to_crash_report(pCrashReport, CD_REPRODUCE, CD_TXT, CD_ISEDITABLE, "1.\n2.\n3.\n"); } void CMiddleWare::Report(const map_crash_report_t& pCrashReport) { - if (pCrashReport.find(CI_MWANALYZER) == pCrashReport.end() || - pCrashReport.find(CI_MWUID) == pCrashReport.end() || - pCrashReport.find(CI_MWUUID) == pCrashReport.end()) + if (pCrashReport.find(CD_MWANALYZER) == pCrashReport.end() || + pCrashReport.find(CD_MWUID) == pCrashReport.end() || + pCrashReport.find(CD_MWUUID) == pCrashReport.end()) { throw std::string("CMiddleWare::Report(): Important data are missing."); } - std::string analyzer = pCrashReport.find(CI_MWANALYZER)->second[CD_CONTENT]; - std::string UID = pCrashReport.find(CI_MWUID)->second[CD_CONTENT]; - std::string UUID = pCrashReport.find(CI_MWUUID)->second[CD_CONTENT]; + std::string analyzer = pCrashReport.find(CD_MWANALYZER)->second[CD_CONTENT]; + std::string UID = pCrashReport.find(CD_MWUID)->second[CD_CONTENT]; + std::string UUID = pCrashReport.find(CD_MWUUID)->second[CD_CONTENT]; if (m_mapAnalyzerReporters.find(analyzer) != m_mapAnalyzerReporters.end()) { @@ -403,17 +404,17 @@ map_crash_info_t CMiddleWare::GetCrashInfo(const std::string& pUUID, std::string data; dd.LoadText(FILENAME_EXECUTABLE, data); - add_crash_data_to_crash_info(crashInfo, CI_EXECUTABLE, CD_TXT, data); + add_crash_data_to_crash_info(crashInfo, CD_EXECUTABLE, data); dd.LoadText(FILENAME_PACKAGE, data); - add_crash_data_to_crash_info(crashInfo, CI_PACKAGE, CD_TXT, data); + add_crash_data_to_crash_info(crashInfo, CD_PACKAGE, data); dd.LoadText(FILENAME_DESCRIPTION, data); - add_crash_data_to_crash_info(crashInfo, CI_DESCRIPTION, CD_TXT, data); + add_crash_data_to_crash_info(crashInfo, CD_DESCRIPTION, data); dd.Close(); - add_crash_data_to_crash_info(crashInfo, CI_UUID, CD_TXT, row.m_sUUID); - add_crash_data_to_crash_info(crashInfo, CI_UID, CD_TXT, row.m_sUID); - add_crash_data_to_crash_info(crashInfo, CI_COUNT, CD_TXT, row.m_sCount); - add_crash_data_to_crash_info(crashInfo, CI_TIME, CD_TXT, row.m_sTime); - add_crash_data_to_crash_info(crashInfo, CI_REPORTED, CD_TXT, row.m_sReported); + add_crash_data_to_crash_info(crashInfo, CD_UUID, row.m_sUUID); + add_crash_data_to_crash_info(crashInfo, CD_UID, row.m_sUID); + add_crash_data_to_crash_info(crashInfo, CD_COUNT, row.m_sCount); + add_crash_data_to_crash_info(crashInfo, CD_TIME, row.m_sTime); + add_crash_data_to_crash_info(crashInfo, CD_REPORTED, row.m_sReported); return crashInfo; } diff --git a/lib/MiddleWare/PluginManager.cpp b/lib/MiddleWare/PluginManager.cpp index 00c54fa6..2f103f26 100644 --- a/lib/MiddleWare/PluginManager.cpp +++ b/lib/MiddleWare/PluginManager.cpp @@ -116,8 +116,19 @@ void CPluginManager::RegisterPlugin(const std::string& pName) { std::string path = m_sPlugisConfDir + "/" + pName + "." + PLUGINS_CONF_EXTENSION; CPlugin* plugin = m_mapABRTPlugins[pName]->PluginNew(); - plugin->Init(); - plugin->LoadSettings(path); + try + { + plugin->Init(); + plugin->LoadSettings(path); + } + catch (std::string sError) + { + std::cerr << "Can not initialize plugin " << pName << "(" + << plugin_type_str_t[m_mapABRTPlugins[pName]->GetType()] + << ")" << std::endl; + UnLoadPlugin(pName); + return; + } m_mapPlugins[pName] = plugin; std::cerr << "Registred plugin " << pName << "(" << plugin_type_str_t[m_mapABRTPlugins[pName]->GetType()] diff --git a/lib/MiddleWare/test.cpp b/lib/MiddleWare/test.cpp index 9422b0b8..c44b5cc8 100644 --- a/lib/MiddleWare/test.cpp +++ b/lib/MiddleWare/test.cpp @@ -50,21 +50,20 @@ int main(int argc, char** argv) middleWare.SetOpenGPGCheck(false); middleWare.AddAnalyzerReporter("CCpp", "Logger"); middleWare.AddAnalyzerAction("CCpp", "RunApp", "date,action_date"); - std::cout << "sasas" <<std::endl; map_crash_info_t crashInfo; if (middleWare.SaveDebugDump(argv[1], crashInfo)) { std::cout << "Application Crashed! " << - crashInfo[item_crash_into_t_str[CI_PACKAGE]][CD_CONTENT] << ", " << - crashInfo[item_crash_into_t_str[CI_EXECUTABLE]][CD_CONTENT] << ", " << - crashInfo[item_crash_into_t_str[CI_COUNT]][CD_CONTENT] << ", " << std::endl; + crashInfo[CD_PACKAGE][CD_CONTENT] << ", " << + crashInfo[CD_EXECUTABLE][CD_CONTENT] << ", " << + crashInfo[CD_COUNT][CD_CONTENT] << ", " << std::endl; /* Get Report, so user can change data (remove private stuff) * If we do not want user interaction, just send data immediately */ map_crash_report_t crashReport; - middleWare.CreateCrashReport(crashInfo[item_crash_into_t_str[CI_UUID]][CD_CONTENT], - crashInfo[item_crash_into_t_str[CI_UID]][CD_CONTENT], + middleWare.CreateCrashReport(crashInfo[CD_UUID][CD_CONTENT], + crashInfo[CD_UID][CD_CONTENT], crashReport); /* Report crash */ middleWare.Report(crashReport); diff --git a/lib/Plugins/CCpp.cpp b/lib/Plugins/CCpp.cpp index 7a4fdc30..95a9fffb 100644 --- a/lib/Plugins/CCpp.cpp +++ b/lib/Plugins/CCpp.cpp @@ -25,7 +25,6 @@ #include "PluginSettings.h" #include <sstream> #include <iostream> -#include <hash_map> #include <ctype.h> #include <unistd.h> #include <sys/types.h> @@ -33,9 +32,19 @@ #include <fcntl.h> #include <stdlib.h> #include <string.h> +#include <iomanip> + +#include <nss.h> +#include <sechash.h> +#include <prinit.h> + #define CORE_PATTERN_IFACE "/proc/sys/kernel/core_pattern" -#define CORE_PATTERN "|"CCPP_HOOK_PATH" %p %s %u" +#define CORE_PATTERN "|"CCPP_HOOK_PATH" "DEBUG_DUMPS_DIR" %p %s %u" + +#define FILENAME_COREDUMP "coredump" +#define FILENAME_BACKTRACE "backtrace" +#define FILENAME_MEMORYMAP "memorymap" CAnalyzerCCpp::CAnalyzerCCpp() : m_bMemoryMap(false), @@ -51,10 +60,34 @@ CAnalyzerCCpp::~CAnalyzerCCpp() } } +std::string CAnalyzerCCpp::CreateHash(const std::string& pInput) +{ + std::string ret = ""; + HASHContext* hc; + unsigned char hash[SHA1_LENGTH]; + unsigned int len; + + hc = HASH_Create(HASH_AlgSHA1); + if (!hc) + { + throw std::string("CAnalyzerCCpp::CreateHash(): cannot initialize hash."); + } + HASH_Begin(hc); + HASH_Update(hc, reinterpret_cast<const unsigned char*>(pInput.c_str()), pInput.length()); + HASH_End(hc, hash, &len, sizeof(hash)); + HASH_Destroy(hc); + + unsigned int ii; + std::stringstream ss; + for (ii = 0; ii < len; ii++) + ss << std::setw(2) << std::setfill('0') << std::hex << (hash[ii]&0xff); + + return ss.str(); +} + void CAnalyzerCCpp::InstallDebugInfos(const std::string& pPackage) { std::string packageName = pPackage.substr(0, pPackage.rfind("-", pPackage.rfind("-")-1)); - std::cerr << packageName << std::endl; char buff[1024]; int pipein[2], pipeout[2]; struct timeval delay; @@ -169,8 +202,8 @@ void CAnalyzerCCpp::GetBacktrace(const std::string& pDebugDumpDir, std::string& dd.LoadText(FILENAME_UID, UID); dd.Close(); fTmp << "file " << executable << std::endl; - fTmp << "core " << pDebugDumpDir << "/" << FILENAME_BINARYDATA1 << std::endl; - fTmp << "bt" << std::endl; + fTmp << "core " << pDebugDumpDir << "/" << FILENAME_COREDUMP << std::endl; + fTmp << "bt full" << std::endl; fTmp << "q" << std::endl; fTmp.close(); } @@ -178,8 +211,11 @@ void CAnalyzerCCpp::GetBacktrace(const std::string& pDebugDumpDir, std::string& { throw "CAnalyzerCCpp::GetBacktrace(): cannot create gdb script " + tmpFile ; } - - RunGdb(tmpFile, UID, pBacktrace); + char* command = (char*)"gdb"; + char* args[5] = { (char*)"gdb", (char*)"-batch", (char*)"-x", NULL, NULL }; + args[3] = strdup(tmpFile.c_str()); + ExecVP(command, args, UID, pBacktrace); + free(args[3]); } void CAnalyzerCCpp::GetIndependentBacktrace(const std::string& pBacktrace, std::string& pIndependentBacktrace) @@ -189,13 +225,22 @@ void CAnalyzerCCpp::GetIndependentBacktrace(const std::string& pBacktrace, std:: { std::string line = ""; int jj = 0; + bool in_bracket = false; - while (pBacktrace[ii] != '\n' && ii < pBacktrace.length()) + while ((pBacktrace[ii] != '\n' || in_bracket) && ii < pBacktrace.length()) { + if (pBacktrace[ii] == '(') + { + in_bracket = true; + } + else if (pBacktrace[ii] == ')') + { + in_bracket = false; + } line += pBacktrace[ii]; ii++; } - while (isspace(line[jj])) + while (isspace(line[jj]) && jj < line.length()) { jj++; } @@ -203,13 +248,23 @@ void CAnalyzerCCpp::GetIndependentBacktrace(const std::string& pBacktrace, std:: { while(jj < line.length()) { - if (isspace(line[jj])) + if (isspace(line[jj]) && jj < line.length()) + { + jj++; + } + else if (line[jj] == '\"') { jj++; + while (line[jj] != '\"' && jj < line.length()) + { + jj++; + } } - else if (line[jj] == '0' && line[jj+1] == 'x') + else if ((line[jj] == '=' && isdigit(line[jj+1])) || + (line[jj] == '0' && line[jj+1] == 'x') ) { - while (isalnum(line[jj])) + jj += 2; + while (isalnum(line[jj]) && jj < line.length()) { jj++; } @@ -225,7 +280,34 @@ void CAnalyzerCCpp::GetIndependentBacktrace(const std::string& pBacktrace, std:: } } -void CAnalyzerCCpp::RunGdb(const std::string& pScript, const std::string pUID, std::string& pOutput) +void CAnalyzerCCpp::GetIndependentBuldIdPC(const std::string& pBuildIdPC, std::string& pIndependentBuildIdPC) +{ + int ii = 0; + while (ii < pBuildIdPC.length()) + { + std::string line = ""; + int jj = 0; + + while (pBuildIdPC[ii] != '\n' && ii < pBuildIdPC.length()) + { + line += pBuildIdPC[ii]; + ii++; + } + while (!isspace(line[jj]) && jj < line.length()) + { + jj++; + } + jj++; + while (!isspace(line[jj]) && jj < line.length()) + { + pIndependentBuildIdPC += line[jj]; + jj++; + } + ii++; + } +} + +void CAnalyzerCCpp::ExecVP(const char* pCommand, char* const pArgs[], const std::string& pUID, std::string& pOutput) { int pipeout[2]; char buff[1024]; @@ -255,7 +337,7 @@ void CAnalyzerCCpp::RunGdb(const std::string& pScript, const std::string pUID, s seteuid(atoi(pUID.c_str())); setsid(); - execlp("gdb", "gdb","-batch", "-x", pScript.c_str(), NULL); + execvp(pCommand, pArgs); exit(0); } @@ -295,37 +377,40 @@ void CAnalyzerCCpp::RunGdb(const std::string& pScript, const std::string pUID, s std::string CAnalyzerCCpp::GetLocalUUID(const std::string& pDebugDumpDir) { - - std::stringstream ss; - char* core; - unsigned int size; - std::string executable; CDebugDump dd; - + std::string UID; + std::string executable; + std::string package; + std::string buildIdPC; + std::string independentBuildIdPC; + std::string core = "--core="+ pDebugDumpDir + "/" +FILENAME_COREDUMP; + char* command = (char*)"eu-unstrip"; + char* args[4] = { (char*)"eu-unstrip", NULL, (char*)"-n", NULL }; + args[1] = strdup(core.c_str()); dd.Open(pDebugDumpDir); - dd.LoadBinary(FILENAME_BINARYDATA1, &core, &size); + dd.LoadText(FILENAME_UID, UID); dd.LoadText(FILENAME_EXECUTABLE, executable); + dd.LoadText(FILENAME_PACKAGE, package); + ExecVP(command, args, UID, buildIdPC); dd.Close(); - // TODO: compute local UUID, remove this hack - ss << executable << "_" << size; - - return ss.str(); + free(args[1]); + GetIndependentBuldIdPC(buildIdPC, independentBuildIdPC); + return CreateHash(package + executable + independentBuildIdPC); } std::string CAnalyzerCCpp::GetGlobalUUID(const std::string& pDebugDumpDir) { - std::stringstream ss; std::string backtrace; + std::string executable; + std::string package; std::string independentBacktrace; - __gnu_cxx::hash<const char*> hash; - CDebugDump dd; dd.Open(pDebugDumpDir); - dd.LoadText(FILENAME_TEXTDATA1, backtrace); + dd.LoadText(FILENAME_BACKTRACE, backtrace); + dd.LoadText(FILENAME_EXECUTABLE, executable); + dd.LoadText(FILENAME_PACKAGE, package); dd.Close(); GetIndependentBacktrace(backtrace, independentBacktrace); - // TODO: compute global UUID, remove this hack - ss << hash(independentBacktrace.c_str()); - return ss.str(); + return CreateHash(package + executable + independentBacktrace); } void CAnalyzerCCpp::CreateReport(const std::string& pDebugDumpDir) @@ -334,7 +419,7 @@ void CAnalyzerCCpp::CreateReport(const std::string& pDebugDumpDir) std::string backtrace; CDebugDump dd; dd.Open(pDebugDumpDir); - if (dd.Exist(FILENAME_TEXTDATA1)) + if (dd.Exist(FILENAME_BACKTRACE)) { dd.Close(); return; @@ -347,10 +432,10 @@ void CAnalyzerCCpp::CreateReport(const std::string& pDebugDumpDir) GetBacktrace(pDebugDumpDir, backtrace); dd.Open(pDebugDumpDir); - dd.SaveText(FILENAME_TEXTDATA1, backtrace); + dd.SaveText(FILENAME_BACKTRACE, backtrace); if (m_bMemoryMap) { - dd.SaveText(FILENAME_TEXTDATA2, "memory map of the crashed C/C++ application, not implemented yet"); + dd.SaveText(FILENAME_MEMORYMAP, "memory map of the crashed C/C++ application, not implemented yet"); } dd.Close(); } @@ -371,6 +456,10 @@ void CAnalyzerCCpp::Init() fOutCorePattern << CORE_PATTERN << std::endl; fOutCorePattern.close(); } + if (NSS_NoDB_Init(NULL) != SECSuccess) + { + throw std::string("CAnalyzerCCpp::CreateHash(): cannot initialize NSS library."); + } } @@ -383,6 +472,7 @@ void CAnalyzerCCpp::DeInit() fOutCorePattern << m_sOldCorePattern << std::endl; fOutCorePattern.close(); } + NSS_Shutdown(); } void CAnalyzerCCpp::LoadSettings(const std::string& pPath) diff --git a/lib/Plugins/CCpp.h b/lib/Plugins/CCpp.h index 41a4d5b4..1011b707 100644 --- a/lib/Plugins/CCpp.h +++ b/lib/Plugins/CCpp.h @@ -36,8 +36,9 @@ class CAnalyzerCCpp : public CAnalyzer void InstallDebugInfos(const std::string& pPackage); void GetBacktrace(const std::string& pDebugDumpDir, std::string& pBacktrace); void GetIndependentBacktrace(const std::string& pBacktrace, std::string& pIndependentBacktrace); - void RunGdb(const std::string& pScript, const std::string pUID, std::string& pOutput); - + void GetIndependentBuldIdPC(const std::string& pBuildIdPC, std::string& pIndependentBuildIdPC); + void ExecVP(const char* pCommand, char* const pArgs[], const std::string& pUID, std::string& pOutput); + std::string CreateHash(const std::string& pInput); public: CAnalyzerCCpp(); virtual ~CAnalyzerCCpp(); diff --git a/lib/Plugins/Kerneloops.cpp b/lib/Plugins/Kerneloops.cpp index b743a48a..144fac8d 100644 --- a/lib/Plugins/Kerneloops.cpp +++ b/lib/Plugins/Kerneloops.cpp @@ -40,6 +40,7 @@ #include <asm/unistd.h> #define MAX(A,B) ((A) > (B) ? (A) : (B)) +#define FILENAME_KERNELOOPS "kerneloops" CAnalyzerKerneloops::CAnalyzerKerneloops() : m_sSysLogFile("/var/log/messages") @@ -60,7 +61,7 @@ std::string CAnalyzerKerneloops::GetLocalUUID(const std::string& pDebugDumpDir) std::stringstream m_sHash; CDebugDump m_pDebugDump; m_pDebugDump.Open(pDebugDumpDir); - m_pDebugDump.LoadText(FILENAME_TEXTDATA1, m_sOops); + m_pDebugDump.LoadText(FILENAME_KERNELOOPS, m_sOops); /* An algorithm proposed by Donald E. Knuth in The Art Of Computer * Programming Volume 3, under the topic of sorting and search @@ -110,7 +111,7 @@ void CAnalyzerKerneloops::Report() m_pDebugDump.SaveText(FILENAME_EXECUTABLE, "kernel"); m_pDebugDump.SaveText(FILENAME_KERNEL, m_pOops.m_sVersion); m_pDebugDump.SaveText(FILENAME_PACKAGE, "not_applicable"); - m_pDebugDump.SaveText(FILENAME_TEXTDATA1, m_pOops.m_sData); + m_pDebugDump.SaveText(FILENAME_KERNELOOPS, m_pOops.m_sData); m_pDebugDump.Close(); } catch (std::string sError) diff --git a/lib/Plugins/KerneloopsReporter.cpp b/lib/Plugins/KerneloopsReporter.cpp index 116fc8d5..71219104 100644 --- a/lib/Plugins/KerneloopsReporter.cpp +++ b/lib/Plugins/KerneloopsReporter.cpp @@ -32,6 +32,8 @@ #include <string.h> #include <curl/curl.h> +#define FILENAME_KERNELOOPS "kerneloops" + CKerneloopsReporter::CKerneloopsReporter() : m_sSubmitURL("http://submit.kerneloops.org/submitoops.php") {} @@ -66,7 +68,7 @@ void CKerneloopsReporter::Report(const map_crash_report_t& pCrashReport) curl_formadd(&post, &last, CURLFORM_COPYNAME, "oopsdata", - CURLFORM_COPYCONTENTS, pCrashReport.find(FILENAME_TEXTDATA1)->second[CD_CONTENT].c_str(), + CURLFORM_COPYCONTENTS, pCrashReport.find(FILENAME_KERNELOOPS)->second[CD_CONTENT].c_str(), CURLFORM_END); curl_formadd(&post, &last, CURLFORM_COPYNAME, "pass_on_allowed", diff --git a/lib/Plugins/Makefile.am b/lib/Plugins/Makefile.am index 292918eb..5475e32e 100644 --- a/lib/Plugins/Makefile.am +++ b/lib/Plugins/Makefile.am @@ -14,7 +14,8 @@ dist_pluginsconf_DATA = CCpp.conf Mailx.conf SQLite3.conf Logger.conf Kerneloops # CCpp libCCpp_la_SOURCES = CCpp.cpp CCpp.h PluginSettings.h libCCpp_la_LDFLAGS = -avoid-version -libCCpp_la_CPPFLAGS = -I$(srcdir)/../MiddleWare -I$(srcdir)/../Utils -DCCPP_HOOK_PATH=\"${libexecdir}/hookCCpp\" +libCCpp_la_LIBADD = $(NSS_LIBS) +libCCpp_la_CPPFLAGS = -I$(srcdir)/../MiddleWare -I$(srcdir)/../Utils -DCCPP_HOOK_PATH=\"${libexecdir}/hookCCpp\" -DDEBUG_DUMPS_DIR=\"$(DEBUG_DUMPS_DIR)\" $(NSS_CFLAGS) # Kerneloops libKerneloops_la_SOURCES = Kerneloops.cpp Kerneloops.h KerneloopsSysLog.cpp KerneloopsSysLog.h PluginSettings.h diff --git a/lib/Utils/DebugDump.h b/lib/Utils/DebugDump.h index 94323e4c..0539f76e 100644 --- a/lib/Utils/DebugDump.h +++ b/lib/Utils/DebugDump.h @@ -36,11 +36,6 @@ #define FILENAME_ANALYZER "analyzer" #define FILENAME_RELEASE "release" #define FILENAME_EXECUTABLE "executable" -#define FILENAME_CMDLINE "cmdline" -#define FILENAME_TEXTDATA1 "text_data_1" -#define FILENAME_TEXTDATA2 "text_data_2" -#define FILENAME_BINARYDATA1 "binary_data_1" -#define FILENAME_BINARYDATA2 "binary_data_1" class CDebugDump { diff --git a/lib/Utils/Makefile.am b/lib/Utils/Makefile.am index c791dc54..a5c35f33 100644 --- a/lib/Utils/Makefile.am +++ b/lib/Utils/Makefile.am @@ -1,7 +1,7 @@ -lib_LTLIBRARIES = libUtils.la -libUtils_la_SOURCES = DebugDump.cpp DebugDump.h -libUtils_la_LDFLAGS = -version-info 0:1:0 -libUtils_la_LIBADD = -lmagic +lib_LTLIBRARIES = libABRTUtils.la +libABRTUtils_la_SOURCES = DebugDump.cpp DebugDump.h +libABRTUtils_la_LDFLAGS = -version-info 0:1:0 +libABRTUtils_la_LIBADD = -lmagic install-data-local: $(mkdir_p) '$(DESTDIR)/$(DEBUG_DUMPS_DIR)'
\ No newline at end of file diff --git a/src/Daemon/CrashWatcher.cpp b/src/Daemon/CrashWatcher.cpp index bd9ea13a..c5450062 100644 --- a/src/Daemon/CrashWatcher.cpp +++ b/src/Daemon/CrashWatcher.cpp @@ -77,7 +77,7 @@ gboolean CCrashWatcher::handle_event_cb(GIOChannel *gio, GIOCondition condition, if(cc->m_pMW->SaveDebugDump(std::string(DEBUG_DUMPS_DIR) + "/" + name, crashinfo)) { /* send message to dbus */ - cc->m_pCommLayer->Crash(crashinfo[CI_PACKAGE][CD_CONTENT]); + cc->m_pCommLayer->Crash(crashinfo[CD_PACKAGE][CD_CONTENT]); } } catch(std::string err) diff --git a/src/Daemon/Makefile.am b/src/Daemon/Makefile.am index fd079997..8c05723b 100644 --- a/src/Daemon/Makefile.am +++ b/src/Daemon/Makefile.am @@ -7,7 +7,7 @@ abrt_CPPFLAGS = -Wall -Werror -I../../lib/MiddleWare -I../../lib/CommLayer\ -DPLUGINS_LIB_DIR=\"$(PLUGINS_LIB_DIR)\" \ -DPLUGINS_CONF_DIR=\"$(PLUGINS_CONF_DIR)\" \ -DCONF_DIR=\"$(CONF_DIR)\" -abrt_LDADD = ../../lib/MiddleWare/libMiddleWare.la ../../lib/CommLayer/libABRTCommLayer.la $(DL_LIBS) $(DBUSCPP_LIBS) $(RPM_LIBS) +abrt_LDADD = ../../lib/MiddleWare/libABRTMiddleWare.la ../../lib/CommLayer/libABRTCommLayer.la $(DL_LIBS) $(DBUSCPP_LIBS) $(RPM_LIBS) dbusabrtconfdir = ${sysconfdir}/dbus-1/system.d/ dist_dbusabrtconf_DATA = dbus-abrt.conf diff --git a/src/Hooks/CCpp.cpp b/src/Hooks/CCpp.cpp index b309414c..646beaff 100644 --- a/src/Hooks/CCpp.cpp +++ b/src/Hooks/CCpp.cpp @@ -32,14 +32,23 @@ #define FILENAME_EXECUTABLE "executable" #define FILENAME_CMDLINE "cmdline" +#define FILENAME_COREDUMP "coredump" -static void write_log(const char* pid) +static void write_success_log(const char* pid) { openlog("abrt", 0, LOG_DAEMON); syslog(LOG_WARNING, "CCpp Language Hook: Crashed pid: %s", pid); closelog(); } +static void write_faliure_log(const char* msg) +{ + openlog("abrt", 0, LOG_DAEMON); + syslog(LOG_WARNING, "CCpp Language Hook: Exception occur: %s", msg); + closelog(); +} + + char* get_executable(const char* pid) { char path[PATH_MAX]; @@ -88,13 +97,14 @@ int main(int argc, char** argv) const char* program_name = argv[0]; if (argc < 3) { - fprintf(stderr, "Usage: %s: <pid> <signal> <uid>\n", + fprintf(stderr, "Usage: %s: <dddir> <pid> <signal> <uid>\n", program_name); return -1; } - const char* pid = argv[1]; - const char* signal = argv[2]; - const char* uid = argv[3]; + const char* dddir = argv[1]; + const char* pid = argv[2]; + const char* signal = argv[3]; + const char* uid = argv[4]; if (strcmp(signal, "3") != 0 && // SIGQUIT strcmp(signal, "4") != 0 && // SIGILL @@ -125,16 +135,14 @@ int main(int argc, char** argv) throw std::string("Can not get proc info."); } - snprintf(path, sizeof(path), "%s/ccpp-%ld-%s", - DEBUG_DUMPS_DIR, time(NULL), pid); + snprintf(path, sizeof(path), "%s/ccpp-%ld-%s", dddir, time(NULL), pid); dd.Create(path); dd.SaveText(FILENAME_ANALYZER, "CCpp"); dd.SaveText(FILENAME_EXECUTABLE, executable); dd.SaveText(FILENAME_UID, uid); dd.SaveText(FILENAME_CMDLINE, cmdline); - snprintf(path + strlen(path), sizeof(path), "/%s", - FILENAME_BINARYDATA1); + snprintf(path + strlen(path), sizeof(path), "/%s", FILENAME_COREDUMP); if ((fp = fopen(path, "w")) == NULL) { @@ -158,11 +166,12 @@ int main(int argc, char** argv) free(cmdline); fclose(fp); dd.Close(); - write_log(pid); + write_success_log(pid); } catch (std::string sError) { fprintf(stderr, "%s: %s\n", program_name, sError.c_str()); + write_faliure_log(sError.c_str()); return -2; } return 0; diff --git a/src/Hooks/Makefile.am b/src/Hooks/Makefile.am index 2e682f57..48d34e84 100644 --- a/src/Hooks/Makefile.am +++ b/src/Hooks/Makefile.am @@ -2,6 +2,6 @@ libexec_PROGRAMS = hookCCpp # CCpp hookCCpp_SOURCES = CCpp.cpp -hookCCpp_LDADD = ../../lib/Utils/libUtils.la +hookCCpp_LDADD = ../../lib/Utils/libABRTUtils.la hookCCpp_CPPFLAGS = -I$(srcdir)/../../lib/Utils \ -DDEBUG_DUMPS_DIR=\"$(DEBUG_DUMPS_DIR)\" |