git://scm.lunaixsky.com
/
lunaix-os.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Merge branch 'master' of github.com:Minep/lunaix-os
[lunaix-os.git]
/
lunaix-os
/
kernel
/
debug
/
trace.c
diff --git
a/lunaix-os/kernel/debug/trace.c
b/lunaix-os/kernel/debug/trace.c
index 1cf9ae34d37295a7251058d80813c978c7e84e12..1c909197bc8f0a594ba34ed4f91c73dabdc6e917 100644
(file)
--- a/
lunaix-os/kernel/debug/trace.c
+++ b/
lunaix-os/kernel/debug/trace.c
@@
-77,6
+77,10
@@
ksym_getstr(struct ksym_entry* sym)
trace_ctx.ksym_table->ksym_label_off + sym->label_off);
}
trace_ctx.ksym_table->ksym_label_off + sym->label_off);
}
+static inline bool valid_fp(ptr_t ptr) {
+ return KERNEL_STACK < ptr && ptr < KERNEL_EXEC_END;
+}
+
int
trace_walkback(struct trace_record* tb_buffer,
ptr_t fp,
int
trace_walkback(struct trace_record* tb_buffer,
ptr_t fp,
@@
-87,7
+91,7
@@
trace_walkback(struct trace_record* tb_buffer,
struct ksym_entry* current = NULL;
int i = 0;
struct ksym_entry* current = NULL;
int i = 0;
- while (
frame
&& i < limit) {
+ while (
valid_fp((ptr_t)frame)
&& i < limit) {
ptr_t pc = *(frame + 1);
current = trace_sym_lookup(pc);
ptr_t pc = *(frame + 1);
current = trace_sym_lookup(pc);
@@
-100,6
+104,10
@@
trace_walkback(struct trace_record* tb_buffer,
i++;
}
i++;
}
+ if (!valid_fp((ptr_t)frame)) {
+ frame = NULL;
+ }
+
if (last_fp) {
*last_fp = (ptr_t)frame;
}
if (last_fp) {
*last_fp = (ptr_t)frame;
}