summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorZdenek Prikryl <zdeny@dhcp-lab-218.englab.brq.redhat.com>2009-04-08 13:44:35 +0200
committerZdenek Prikryl <zdeny@dhcp-lab-218.englab.brq.redhat.com>2009-04-08 13:44:35 +0200
commit234a905fe548f73f5e1df0db5b3490ae9b00a9d5 (patch)
tree70dca16dbb78da5925a626890442b687b04a4f80
parent5c4a18fdd9795abaed59d3f5718d60cecde889ab (diff)
downloadabrt-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.ac4
-rw-r--r--lib/CommLayer/Makefile.am4
-rw-r--r--lib/MiddleWare/CrashTypes.h28
-rw-r--r--lib/MiddleWare/Makefile.am12
-rw-r--r--lib/MiddleWare/MiddleWare.cpp41
-rw-r--r--lib/MiddleWare/PluginManager.cpp15
-rw-r--r--lib/MiddleWare/test.cpp11
-rw-r--r--lib/Plugins/CCpp.cpp160
-rw-r--r--lib/Plugins/CCpp.h5
-rw-r--r--lib/Plugins/Kerneloops.cpp5
-rw-r--r--lib/Plugins/KerneloopsReporter.cpp4
-rw-r--r--lib/Plugins/Makefile.am3
-rw-r--r--lib/Utils/DebugDump.h5
-rw-r--r--lib/Utils/Makefile.am8
-rw-r--r--src/Daemon/CrashWatcher.cpp2
-rw-r--r--src/Daemon/Makefile.am2
-rw-r--r--src/Hooks/CCpp.cpp29
-rw-r--r--src/Hooks/Makefile.am2
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)\"