summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFrank Gevaerts <frank@gevaerts.be>2014-01-05 22:20:26 +0100
committerFrank Gevaerts <frank@gevaerts.be>2014-01-11 11:37:18 +0100
commit25e50ed8f1361ef3295aeb298a3edf2214f5b3b3 (patch)
treea4b5516cb23e2915666eb0f36ef7462e6b5228c3
parentfe73d75e7485019a6206c4aa7e414a93bc70c05f (diff)
downloadrockbox-25e50ed.tar.gz
rockbox-25e50ed.tar.bz2
rockbox-25e50ed.zip
Print `last logf lines on panic().
If logf is enabled, panic() will print the last lines. On small screens this is more or less useless, but on large screens it can be very useful for debugging. Change-Id: I26dfc76e9ac4a2ddc2def8db1616a04f943dbba3 Reviewed-on: http://gerrit.rockbox.org/709 Reviewed-by: Thomas Martitz <kugel@rockbox.org> Reviewed-by: Frank Gevaerts <frank@gevaerts.be> Tested: Frank Gevaerts <frank@gevaerts.be>
-rw-r--r--firmware/export/logf.h2
-rw-r--r--firmware/logf.c49
-rw-r--r--firmware/panic.c4
3 files changed, 55 insertions, 0 deletions
diff --git a/firmware/export/logf.h b/firmware/export/logf.h
index b57ae91872..e881e7e496 100644
--- a/firmware/export/logf.h
+++ b/firmware/export/logf.h
@@ -39,6 +39,8 @@ extern bool logfwrap;
#define logf _logf
void _logf(const char *format, ...) ATTRIBUTE_PRINTF(1, 2);
+void logf_panic_dump(int *y);
+
#else /* !ROCKBOX_HAS_LOGF */
/* built without logf() support enabled, replace logf() by DEBUGF() */
diff --git a/firmware/logf.c b/firmware/logf.c
index fadfc9bb13..a24a635570 100644
--- a/firmware/logf.c
+++ b/firmware/logf.c
@@ -32,6 +32,7 @@
#include "config.h"
#include "system.h"
#include "font.h"
+#include "lcd.h"
#ifdef HAVE_REMOTE_LCD
#include "lcd-remote.h"
#endif
@@ -254,6 +255,54 @@ void _logf(const char *fmt, ...)
}
#endif
+void logf_panic_dump(int *y)
+{
+ int i;
+ /* nothing to print ? */
+ if(logfindex == 0 && !logfwrap)
+ {
+ lcd_puts(1, (*y)++, "no logf data");
+ lcd_update();
+ return;
+ }
+
+ lcd_puts(1, (*y)++, "start of logf data");
+ lcd_update();
+ i = logfindex - 2; /* The last actual characer (i.e. not '\0') */
+
+ while(i >= 0)
+ {
+ while(logfbuffer[i] != 0 && i>=0)
+ {
+ i--;
+ }
+ if(strlen( &logfbuffer[i + 1]) > 0)
+ {
+ lcd_puts(1, (*y)++, &logfbuffer[i + 1]);
+ lcd_update();
+ }
+ i--;
+ }
+ if(logfwrap)
+ {
+ i = MAX_LOGF_SIZE - 1;
+ while(i >= logfindex)
+ {
+ while(logfbuffer[i] != 0 && i >= logfindex)
+ {
+ i--;
+ }
+ if(strlen( &logfbuffer[i + 1]) > 0)
+ {
+ lcd_putsf(1, (*y)++, "%*s", (MAX_LOGF_SIZE-i) &logfbuffer[i + 1]);
+ lcd_update();
+ }
+ }
+ i--;
+ }
+ lcd_puts(1, (*y)++, "end of logf data");
+ lcd_update();
+}
#endif
#ifdef ROCKBOX_HAS_LOGDISKF
diff --git a/firmware/panic.c b/firmware/panic.c
index 0d49847a19..3f01689922 100644
--- a/firmware/panic.c
+++ b/firmware/panic.c
@@ -30,6 +30,7 @@
#include "led.h"
#include "power.h"
#include "system.h"
+#include "logf.h"
#if defined(CPU_ARM)
#include "gcc_extensions.h"
@@ -115,6 +116,9 @@ void panicf( const char *fmt, ...)
#if defined(CPU_ARM)
backtrace(pc, sp, &y);
#endif
+#ifdef ROCKBOX_HAS_LOGF
+ logf_panic_dump(&y);
+#endif
#else
/* no LCD */
#endif