Мне нужно получить информацию о стеке моего приложения C в определенных точках. Я прочитал документацию и обыскал в Сети, но до сих пор не могу понять, как я могу это сделать. Можете ли вы указать на простое объяснение процесса? Или, что еще лучше, к примеру разматывания стека. Мне это нужно для HP-UX (Itanium) и Linux.Stack unwinding на HP-UX и Linux
ответ
Заканчивать линукс/stacktrace.h
Вот ссылка на API:
http://www.cs.cmu.edu/afs/cs/Web/People/tekkotsu/dox/StackTrace_8h.html
Должно работать на всех ядрах Linux
Вот альтернативный пример С из
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));
}
Вы хотите посмотреть на libunwind - это кросс-платформенная библиотека разработана первоначально HP для разматывания стека Itanium следы (которые являются особенно сложными); но впоследствии был расширен до многих других платформ; включая как x86-Linux, так и Itanium-HPUX.
Из справочной страницы libunwind (3); Ниже приведен пример использования libunwind написать типичную функцию 'шоу' трассировку:
#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);
}
}
Это shoulw работа для HPUX Itanium: http://docs.hp.com/en/B9106-90012/unwind.5.html
Для простой трассировки стека, попробуйте U_STACK_TRACE().
- 1. Регулярные выражения в Linux/HPUX
- 2. Ошибка сегментации: переход на C-программу с HPUX на Linux
- 3. Проблема с wcwidth на HPUX: проблема интернационализации и локализации на HPUX
- 4. Запуск C# на HPUX
- 5. Удаленная отладка на HPUX
- 6. Команда sed, которая работает для Solaris, Linux и HPUX
- 7. Как получить сопоставление памяти для ядра на Linux/HPUX (pmap)
- 8. Stack unwinding динамически созданный объект, конструктор которого также действует на кучу
- 9. Zigbee stack на Linux (основное ядро)?
- 10. Как искать повреждение кучи/стека на HPUX?
- 11. компилирование Ncurses ЦСИ на HPUX
- 12. LAMP stack с apache и php на одном сервере linux и mysql на другом сервере linux
- 13. Вывод команды ps на AIX, HPUX и Solaris
- 14. Проверка утечек памяти на HPUX
- 15. Как извлечь файл .depot на HPUX?
- 16. Linux sys_clone. Free'ing stack memory
- 17. Эквивалент HPUX для Linux? или какое оборудование я использую?
- 18. Как найти рабочий каталог запущенного процесса (HPUX/Solaris/Linux/AIX)
- 19. Функция event_new() не работает на hpux itanium
- 20. компилирование рубин 1.9.1-P129 на HPUX
- 21. gdb ARM Cortex-M exception Unwinding
- 22. Idle tcp дескриптор файла после неудачного подключения на HPUX
- 23. C++ Visual Studio 2013 Unwinding object
- 24. В чем разница между .sl и .so на HPUX?
- 25. Программно использовать процессор и память приложения на HPUX
- 26. Как определить режим CPU на HPUX ia64 и Solaris
- 27. ASLR Entropy Bits for Stack on Linux
- 28. Почему SIGALRM не может произойти в потоке на HPUX?
- 29. Stack Walk on linux с использованием ptrace
- 30. Antergos Linux - LEMP stack - Nginx 403
Я не знал, что API существует; как полезно! – Jamie
Не помогает вам HP-UX tho;) – DaveR
@dave, nit-picker: P –