summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDenys Vlasenko <dvlasenk@redhat.com>2010-09-13 18:46:07 +0200
committerDenys Vlasenko <dvlasenk@redhat.com>2010-09-13 18:46:07 +0200
commit3efaffbbd7f0ad0ac798c29f1a8aab4597f555f9 (patch)
tree85a330bae6f84b7cfee3cba5e217bf4e42b79932
parentd77d1c9c139c0d14377177fc05289ff17e42d066 (diff)
downloadabrt-3efaffbbd7f0ad0ac798c29f1a8aab4597f555f9.tar.gz
abrt-3efaffbbd7f0ad0ac798c29f1a8aab4597f555f9.tar.xz
abrt-3efaffbbd7f0ad0ac798c29f1a8aab4597f555f9.zip
CCpp: make gdb timeout configurable; raise it to 120 sec in default config file
Signed-off-by: Denys Vlasenko <dvlasenk@redhat.com>
-rw-r--r--lib/plugins/CCpp.conf2
-rw-r--r--lib/plugins/CCpp.cpp26
-rw-r--r--lib/plugins/CCpp.h1
3 files changed, 19 insertions, 10 deletions
diff --git a/lib/plugins/CCpp.conf b/lib/plugins/CCpp.conf
index 86bfb7db..4af91470 100644
--- a/lib/plugins/CCpp.conf
+++ b/lib/plugins/CCpp.conf
@@ -11,6 +11,8 @@ SaveBinaryImage = no
# Generate backtrace
Backtrace = yes
+# How long to wait for gdb to finish. Default is 60 seconds.
+GdbTimeoutSec = 120
# Generate backtrace for crashes uploaded from remote machines.
# Note that for reliable backtrace generation, your local machine
diff --git a/lib/plugins/CCpp.cpp b/lib/plugins/CCpp.cpp
index 9f52b970..4b1590e5 100644
--- a/lib/plugins/CCpp.cpp
+++ b/lib/plugins/CCpp.cpp
@@ -49,7 +49,8 @@ CAnalyzerCCpp::CAnalyzerCCpp() :
m_bBacktraceRemotes(false),
m_bMemoryMap(false),
m_bInstallDebugInfo(true),
- m_nDebugInfoCacheMB(4000)
+ m_nDebugInfoCacheMB(4000),
+ m_nGdbTimeoutSec(60)
{}
static string create_hash(const char *pInput)
@@ -113,7 +114,7 @@ static string create_hash(const char *pInput)
* @param[out] status See `man 2 wait` for status information.
* @return Malloc'ed string
*/
-static char* exec_vp(char **args, uid_t uid, int redirect_stderr, int *status)
+static char* exec_vp(char **args, uid_t uid, int redirect_stderr, unsigned timeout_sec, int *status)
{
/* Nuke everything which may make setlocale() switch to non-POSIX locale:
* we need to avoid having gdb output in some obscure language.
@@ -143,7 +144,7 @@ static char* exec_vp(char **args, uid_t uid, int redirect_stderr, int *status)
* Therefore we have a (largish) timeout, after which we kill the child.
*/
int t = time(NULL); /* int is enough, no need to use time_t */
- int endtime = t + 60;
+ int endtime = t + timeout_sec;
struct strbuf *buf_out = strbuf_new();
@@ -181,7 +182,7 @@ static char* exec_vp(char **args, uid_t uid, int redirect_stderr, int *status)
return strbuf_free_nobuf(buf_out);
}
-static char *get_backtrace(const char *pDebugDumpDir, const char *pDebugInfoDirs)
+static char *get_backtrace(const char *pDebugDumpDir, const char *pDebugInfoDirs, unsigned timeout_sec)
{
update_client(_("Generating backtrace"));
@@ -201,7 +202,7 @@ static char *get_backtrace(const char *pDebugDumpDir, const char *pDebugInfoDirs
// http://sourceware.org/bugzilla/show_bug.cgi?id=9622
unsetenv("TERM");
// This is not necessary, and was observed to cause
- // environmant corruption (because we run in a thread?):
+ // environment corruption (because we run in a thread?):
//putenv((char*)"TERM=dumb");
char *args[21];
@@ -276,7 +277,7 @@ static char *get_backtrace(const char *pDebugDumpDir, const char *pDebugInfoDirs
while (1)
{
args[9] = xasprintf("%s backtrace %u%s", thread_apply_all, bt_depth, full);
- bt = exec_vp(args, xatoi_u(uid), /*redirect_stderr:*/ 1, NULL);
+ bt = exec_vp(args, xatoi_u(uid), /*redirect_stderr:*/ 1, timeout_sec, NULL);
if (bt && (bt_depth <= 64 || strlen(bt) < 256*1024))
{
free(args[9]);
@@ -332,7 +333,7 @@ static void GetIndependentBuildIdPC(const char *unstrip_n_output,
}
}
-static char* run_unstrip_n(const char *pDebugDumpDir)
+static char* run_unstrip_n(const char *pDebugDumpDir, unsigned timeout_sec)
{
dump_dir_t *dd = dd_init();
if (!dd_opendir(dd, pDebugDumpDir))
@@ -351,7 +352,7 @@ static char* run_unstrip_n(const char *pDebugDumpDir)
args[2] = (char*)"-n";
args[3] = NULL;
- char *out = exec_vp(args, xatoi_u(uid), /*redirect_stderr:*/ 0, NULL);
+ char *out = exec_vp(args, xatoi_u(uid), /*redirect_stderr:*/ 0, timeout_sec, NULL);
free(uid);
free(args[1]);
@@ -541,7 +542,7 @@ string CAnalyzerCCpp::GetLocalUUID(const char *pDebugDumpDir)
dd_close(dd);
string independentBuildIdPC;
- char *unstrip_n_output = run_unstrip_n(pDebugDumpDir);
+ char *unstrip_n_output = run_unstrip_n(pDebugDumpDir, m_nGdbTimeoutSec);
if (unstrip_n_output)
GetIndependentBuildIdPC(unstrip_n_output, independentBuildIdPC);
else
@@ -811,7 +812,7 @@ void CAnalyzerCCpp::CreateReport(const char *pDebugDumpDir, int force)
VERB1 log(_("Skipping the debuginfo installation"));
/* Create and store backtrace. */
- char *backtrace_str = get_backtrace(pDebugDumpDir, m_sDebugInfoDirs.c_str());
+ char *backtrace_str = get_backtrace(pDebugDumpDir, m_sDebugInfoDirs.c_str(), m_nGdbTimeoutSec);
if (!backtrace_str)
{
backtrace_str = xstrdup("");
@@ -1109,6 +1110,11 @@ void CAnalyzerCCpp::SetSettings(const map_plugin_settings_t& pSettings)
{
m_nDebugInfoCacheMB = xatou(it->second.c_str());
}
+ it = pSettings.find("GdbTimeoutSec");
+ if (it != end)
+ {
+ m_nGdbTimeoutSec = xatoi_u(it->second.c_str());
+ }
it = pSettings.find("InstallDebugInfo");
if (it == end) //compat, remove after 0.0.11
it = pSettings.find("InstallDebuginfo");
diff --git a/lib/plugins/CCpp.h b/lib/plugins/CCpp.h
index f547686f..d29a52e1 100644
--- a/lib/plugins/CCpp.h
+++ b/lib/plugins/CCpp.h
@@ -34,6 +34,7 @@ class CAnalyzerCCpp : public CAnalyzer
bool m_bMemoryMap;
bool m_bInstallDebugInfo;
unsigned m_nDebugInfoCacheMB;
+ unsigned m_nGdbTimeoutSec;
std::string m_sOldCorePattern;
std::string m_sDebugInfo;
std::string m_sDebugInfoDirs;