summaryrefslogtreecommitdiffstats
path: root/drkonqi/backtrace.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'drkonqi/backtrace.cpp')
-rw-r--r--drkonqi/backtrace.cpp82
1 files changed, 80 insertions, 2 deletions
diff --git a/drkonqi/backtrace.cpp b/drkonqi/backtrace.cpp
index 61ae8130c..95bc0e054 100644
--- a/drkonqi/backtrace.cpp
+++ b/drkonqi/backtrace.cpp
@@ -25,6 +25,8 @@
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*****************************************************************/
+#include "config.h"
+
#include <tqfile.h>
#include <tqregexp.h>
@@ -36,6 +38,16 @@
#include <tdetempfile.h>
#include <tdehardwaredevices.h>
+#ifdef HAVE_ELFICON
+ // Elven things
+ extern "C" {
+ #include <libr.h>
+ #include <libr-icons.h>
+ }
+ #include <tqfileinfo.h>
+ #include <tdeio/tdelficon.h>
+#endif // HAVE_ELFICON
+
#include "krashconf.h"
#include "backtrace.h"
#include "backtrace.moc"
@@ -199,8 +211,16 @@ bool BackTrace::usefulBacktrace()
TQString strBt = '\n' + m_strBt + '\n';
// how many " ?? " in the bt ?
int unknown = 0;
- if( !m_krashconf->invalidStackFrameRegExp().isEmpty())
- unknown = strBt.contains( TQRegExp( m_krashconf->invalidStackFrameRegExp()));
+ if( !m_krashconf->invalidStackFrameRegExp().isEmpty()) {
+ int isfPos = strBt.find( TQRegExp( m_krashconf->invalidStackFrameRegExp()));
+ int islPos = strBt.find( m_krashconf->infoSharedLibraryHeader());
+ if ((isfPos >=0) && (isfPos < islPos)) {
+ unknown = true;
+ }
+ else {
+ unknown = false;
+ }
+ }
// how many stack frames in the bt ?
int frames = 0;
if( !m_krashconf->frameRegExp().isEmpty())
@@ -278,6 +298,64 @@ void BackTrace::processBacktrace()
}
}
+#ifdef HAVE_ELFICON
+ m_strBt.append("\n==== (tdemetainfo) application version information ====\n");
+
+ // Extract embedded SCM metadata from the crashed application
+ TQString crashedExec = TDEStandardDirs::findExe(m_krashconf->execName());
+ if (crashedExec.startsWith("/")) {
+ libr_file *handle = NULL;
+ libr_access_t access = LIBR_READ;
+
+ if((handle = libr_open(const_cast<char*>(crashedExec.ascii()), access)) == NULL) {
+ kdWarning() << "failed to open file" << crashedExec << endl;
+ }
+ else {
+ TQString scmModule = elf_get_resource(handle, ".metadata_scmmodule");
+ TQString scmRevision = elf_get_resource(handle, ".metadata_scmrevision");
+ if (scmRevision != "") {
+ m_strBt.append(TQString("%1:\t%2:%3\n").arg(TQFileInfo(crashedExec).fileName()).arg(scmModule).arg(scmRevision));
+ }
+ }
+
+ libr_close(handle);
+ }
+
+ m_strBt.append("\n==== (tdemetainfo) library version information ====\n");
+
+ // Extract embedded SCM metadata from shared libraries
+ int islPos = m_strBt.find( m_krashconf->infoSharedLibraryHeader());
+ TQString infoSharedLibraryText = m_strBt.mid(islPos);
+ TQTextStream infoSharedLibraryTextStream(&infoSharedLibraryText, IO_ReadOnly);
+ infoSharedLibraryTextStream.readLine(); // Skip info header x1
+ infoSharedLibraryTextStream.readLine(); // Skip info header x2
+ TQString infoSharedLibraryLine = infoSharedLibraryTextStream.readLine();
+ while (infoSharedLibraryLine != TQString::null) {
+ TQStringList libraryInfoList = TQStringList::split(" ", infoSharedLibraryLine, false);
+ if (libraryInfoList.count() > 0) {
+ TQString libraryName = libraryInfoList[libraryInfoList.count()-1];
+ if (libraryName.startsWith("/")) {
+ libr_file *handle = NULL;
+ libr_access_t access = LIBR_READ;
+
+ if((handle = libr_open(const_cast<char*>(libraryName.ascii()), access)) == NULL) {
+ kdWarning() << "failed to open file" << libraryName << endl;
+ }
+ else {
+ TQString scmModule = elf_get_resource(handle, ".metadata_scmmodule");
+ TQString scmRevision = elf_get_resource(handle, ".metadata_scmrevision");
+ if (scmRevision != "") {
+ m_strBt.append(TQString("%1:\t%2:%3\n").arg(TQFileInfo(libraryName).fileName()).arg(scmModule).arg(scmRevision));
+ }
+ }
+
+ libr_close(handle);
+ }
+ }
+ infoSharedLibraryLine = infoSharedLibraryTextStream.readLine();
+ }
+#endif // HAVE_ELFICON
+
// Append potentially important hardware information
m_strBt.append("\n==== (tdehwlib) hardware information ====\n");
TDEHardwareDevices *hwdevices = TDEGlobal::hardwareDevices();