Stack Abwickeln auf HP-UX und Linux
-
13-09-2019 - |
Frage
Ich brauche die Stack-Informationen meiner C-Anwendung in bestimmten Punkten zu erhalten. Ich habe die Dokumentation und durchsucht das Netz lesen, aber immer noch nicht herausfinden können, wie ich es tun kann. Können Sie zu einem einfachen Prozess Erklärung hinweisen? Oder, noch besser, auf ein Beispiel Stack Abwickeln. Ich brauche es für HP-UX (Itanium) und Linux.
Lösung
Überprüfen Sie heraus linux / stacktrace.h
Hier ist eine API-Referenz:
http: //www.cs .cmu.edu / afs / cs / Web / Leute / tekkotsu / Dox / StackTrace_8h.html
Sollte auf allen Linux-Kernel funktionieren
Hier ist ein alternatives Beispiel in C von
http://www.linuxjournal.com/article/6391
#include <stdio.h>
#include <signal.h>
#include <execinfo.h>
void show_stackframe() {
void *trace[16];
char **messages = (char **)NULL;
int i, trace_size = 0;
trace_size = backtrace(trace, 16);
messages = backtrace_symbols(trace, trace_size);
printf("[bt] Execution path:\n");
for (i=0; i<trace_size; ++i)
printf("[bt] %s\n", messages[i]);
}
int func_low(int p1, int p2) {
p1 = p1 - p2;
show_stackframe();
return 2*p1;
}
int func_high(int p1, int p2) {
p1 = p1 + p2;
show_stackframe();
return 2*p1;
}
int test(int p1) {
int res;
if (p1<10)
res = 5+func_low(p1, 2*p1);
else
res = 5+func_high(p1, 2*p1);
return res;
}
int main() {
printf("First call: %d\n\n", test(27));
printf("Second call: %d\n", test(4));
}
Andere Tipps
Sie möchten unter libunwind - das ist eine plattformübergreifende Bibliothek ursprünglich von HP entwickelt für Abwickeln Itanium Stapel Spuren (die besonders komplex); sondern hat in der Folge auf vielen anderen Plattformen erweitert worden; einschließlich x86-Linux und Itanium-HP-UX.
Von der libunwind (3) man-Seite; hier ist ein Beispiel für die Verwendung libunwind eine typische ‚show Backtrace‘ Funktion zu schreiben:
#define UNW_LOCAL_ONLY
#include <libunwind.h>
void show_backtrace (void) {
unw_cursor_t cursor; unw_context_t uc;
unw_word_t ip, sp;
unw_getcontext(&uc);
unw_init_local(&cursor, &uc);
while (unw_step(&cursor) > 0) {
unw_get_reg(&cursor, UNW_REG_IP, &ip);
unw_get_reg(&cursor, UNW_REG_SP, &sp);
printf ("ip = %lx, sp = %lx\n", (long) ip, (long) sp);
}
}
Diese shoulw Arbeit für HP-UX itanium: http://docs.hp.com/en/B9106-90012/ unwind.5.html
Für einfache Stack-Trace, versucht U_STACK_TRACE ().