Je dois obtenir les informations sur la pile de mon application C sur certains points. J'ai lu la documentation et fouillé le Net mais je n'arrive toujours pas à comprendre comment je peux le faire. Pouvez-vous pointer vers une explication de processus simple? Ou, mieux encore, à un exemple de déroulement de pile. J'en ai besoin pour HP-UX (Itanium) et Linux.Déroulement de la pile sur HP-UX et Linux
Répondre
Check out linux/stacktrace.h
est ici une référence API:
http://www.cs.cmu.edu/afs/cs/Web/People/tekkotsu/dox/StackTrace_8h.html
devrait fonctionner sur tous les noyaux Linux
Voici un autre exemple en C de
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));
}
Vous voulez regarder libunwind - c'est une bibliothèque multiplateforme développée à l'origine par HP pour le déroulement des traces de pile de systèmes Itanium (qui sont particulièrement complexes); mais a ensuite été étendu à de nombreuses autres plates-formes; incluant x86-Linux et Itanium-HPUX.
De la page de manuel libunwind (3); voici un exemple d'utilisation libunwind pour écrire une fonction typique 'Backtrace show':
#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);
}
}
Ce travail de shoulw pour HPUX itanium: http://docs.hp.com/en/B9106-90012/unwind.5.html
Pour trace simple pile, essayez U_STACK_TRACE().
- 1. Comment gcc implémente-t-elle le déroulement de la pile pour les exceptions C++ sous Linux?
- 2. Expressions régulières sous Linux/HPUX
- 3. Débogage à distance sur HPUX
- 4. Linux Outil pour lire les valeurs de la pile
- 5. Ruby 1.9.1-Compiling P129 sur HPUX
- 6. pile de noyau pour le processus linux
- 7. telnet HPUX en utilisant la prise
- 8. Modifications dynamiques de la taille de la pile de threads dans Solaris 9?
- 9. Création d'un réseau d'objets sur la pile et tas
- 10. Windows, Linux et la gestion de la mémoire
- 11. Ajout de l'option de l'éditeur de liens pour renforcer la construction sur HPUX
- 12. Taille de pile sur BlackBerry?
- 13. Protection d'exécution de pile et randomisation sur Ubuntu
- 14. JavaScript et une pile
- 15. Mesure de l'utilisation de la pile pour l'application multi-thread Linux
- 16. Livre sur la programmation de shell Linux
- 17. UTF-8 et Servlets sur Tomcat/Linux
- 18. Vidéos sur Linux et Open Source
- 19. Portillon, pile de pages et utilisation de la mémoire
- 20. D (et Tango) sur Linux PowerPC
- 21. "Dépassement de pile à la ligne: 0" sur Internet Explorer
- 22. Comment convertir des documents au format PDF sur une pile Linux/PHP?
- 23. Dépassement de pile sur IIS 6.0
- 24. Recommandations de la pile ZigBee
- 25. Comment obtenir la pile de pile dans un appareil mobile?
- 26. Ombre WPF sur les contrôles de la pile
- 27. Réinstallez la pile de développement
- 28. Verrouiller la pile libre et la file d'attente en C#
- 29. Python sans pile et multicores?
- 30. Vérificateur de palindrome basé sur une pile
Je ne savais pas que l'API existait; comme c'est utile! – Jamie
Ne vous aide pas pour HP-UX tho;) – DaveR
@dave, nit-picker: P –