backtrace(3) - wariua/manpages-ko GitHub Wiki
backtrace, backtrace_symbols, backtrace_symbols_fd - μμ© μ ν λλ²κΉ μ§μ
#include <execinfo.h>
int backtrace(void **buffer, int size);
char **backtrace_symbols(void *const *buffer, int size);
void backtrace_symbols_fd(void *const *buffer, int size, int fd);
backtrace()
λ buffer
κ° κ°λ¦¬ν€λ λ°°μ΄μ νΈμΆ νλ‘κ·Έλ¨μ λ°±νΈλ μ΄μ€λ₯Ό λ°ννλ€. λ°±νΈλ μ΄μ€λ νλ‘κ·Έλ¨μμ νμ¬ νμ±μΈ ν¨μ νΈμΆλ€μ μ΄μ΄λ€. buffer
κ° κ°λ¦¬ν€λ λ°°μ΄μ κ° νλͺ©μ void *
νμ
μ΄λ©° λμνλ μ€ν νλ μμ λ°ν μ£Όμμ΄λ€. size
μΈμλ buffer
μ μ μ₯ν μ μλ μ£Όμμ μ΅λ κ°μλ₯Ό λνλΈλ€. λ°±νΈλ μ΄μ€κ° size
λ³΄λ€ ν° κ²½μ°μλ κ°μ₯ μ΅κ·Ό size
κ° ν¨μ νΈμΆμ λμνλ μ£Όμλ€μ λ°ννλ€. λ°±νΈλ μ΄μ€ μ 체λ₯Ό μ»μΌλ €λ©΄ buffer
μ size
λ₯Ό μΆ©λΆν ν¬κ² ν΄μΌ νλ€.
backtrace()
κ° λ°νν μ£Όμ μ§ν©μ backtrace_symbols()
μκ² buffer
λ‘ μ£Όλ©΄ μ£Όμλ₯Ό μ¬λ³Όλ‘ λνλΈ λ¬Έμμ΄λ€μ λ°°μ΄λ‘ λ³νν΄ μ€λ€. size
μΈμλ buffer
μ μ£Όμ κ°μλ₯Ό λνλΈλ€. κ° μ£Όμμ μ¬λ³Ό ννμ ν¨μ μ΄λ¦ (μμλΌ μ μλ κ²½μ°), 16μ§μλ‘ λ ν¨μ λ΄ μ€νμ
, (16μ§μλ‘ λ) μ€μ λ°ν μ£Όμλ‘ μ΄λ€μ Έ μλ€. λ¬Έμμ΄ ν¬μΈν°λ€μ λ°°μ΄μ μ£Όμλ₯Ό backtrace_symbols()
κ° ν¨μ κ²°κ³Όλ‘ λ°ννλ€. κ·Έ λ°°μ΄μ backtrace_symbols()
μμ malloc(3) ν κ²μ΄λ―λ‘ νΈμΆμκ° ν΄μ ν΄μΌ νλ€. (κ·Έ ν¬μΈν° λ°°μ΄μ΄ κ°λ¦¬ν€λ λ¬Έμμ΄λ€μ ν΄μ ν νμκ° μμΌλ©° ν΄μλ μ λλ€.)
backtrace_symbols_fd()
λ backtrace_symbols()
μ κ°μ buffer
λ° size
μΈμλ₯Ό λ°λ λ¬Έμμ΄ λ°°μ΄μ νΈμΆμμκ² λ°ννλ λμ νμΌ λμ€ν¬λ¦½ν° fd
μ κ·Έ λ¬Έμμ΄λ€μ ν νμ νλμ© μ΄λ€. backtrace_symbols_fd()
λ malloc(3)μ νΈμΆνμ§ μμΌλ―λ‘ malloc(3)μ΄ μ€ν¨ν μλ μλ κ²½μ°μ μ΄μ©ν μ μλ€. νμ§λ§ NOTESλ₯Ό 보λΌ.
backtrace()
λ buffer
λ‘ λ°ννλ μ£Όμλ€μ μλ₯Ό λ°ννλ©° κ·Έ κ°μ size
λ³΄λ€ ν¬μ§ μλ€. λ°ν κ°μ΄ size
λ³΄λ€ μμ κ²½μ°μλ λ°±νΈλ μ΄μ€ μ μ²΄κ° μ μ₯λ κ²μ΄λ€. size
μ κ°μ κ²½μ°μλ μΌλΆκ° μλ Έμ μλ μμΌλ©°, κ·Έ κ²½μ° μ€λλ μ€ν νλ μλ€μ μ£Όμκ° λ°νλμ§ μλλ€.
μ±κ³΅ μ backtrace_symbols()
λ νΈμΆμμ malloc(3) ν λ°°μ΄μ λν ν¬μΈν°λ₯Ό λ°ννλ€. μ€λ₯ μ NULLμ λ°ννλ€.
μ΄ μ μμ μ¬μ©νλ μ©μ΄λ€μ λν μ€λͺ μ attributes(7)λ₯Ό 보λΌ.
μΈν°νμ΄μ€ | μμ± | κ° |
---|---|---|
backtrace() ,backtrace_symbols() ,backtrace_symbols_fd()
|
μ€λ λ μμ μ± | MT-Safe |
μ΄ ν¨μλ€μ GNU νμ₯μ΄λ€.
μ΄ ν¨μλ€μμλ ν¨μμ λ°ν μ£Όμκ° μ€νμ μ μ₯λλ λ°©μμ λν΄ λͺ κ°μ§ κ°μ μ νλ€. λ€μμ μ μνλΌ.
-
(
gcc(1)
μ 0 μλ μ΅μ ν λ¨κ³λ€μ ν¨μλ) νλ μ ν¬μΈν° μλ΅μΌλ‘ μΈν΄ κ·Έ κ°μ λ€μ΄ μλ°°λ μ μλ€. -
μΈλΌμΈ μ²λ¦¬ λ ν¨μμλ μ€ν νλ μμ΄ μλ€.
-
꼬리 νΈμΆ μ΅μ νκ° μ΄λ€μ§λ©΄ ν μ€ν νλ μμ΄ λ€λ₯Έ νλ μμ λ체νλ€.
-
backtrace()
μbacktrace_symbols_fd()
μμ malloc(3)μ λͺ μμ μΌλ‘ νΈμΆνμ§λ μμ§λ§ κ·Έ ν¨μλ€μ΄ ν¬ν¨λlibgcc
κ° μ΅μ΄ μ¬μ© λ λμ μΌλ‘ μ μ¬λλ€. κ·Έλ¦¬κ³ λμ μ μ¬λ μΌλ°μ μΌλ‘ malloc(3) νΈμΆμ μ λ°νλ€. μ΄ λ ν¨μμ λν νΉμ νΈμΆμ΄ (κ°λ Ή μκ·Έλ νΈλ€λ¬ μμμ) λ©λͺ¨λ¦¬ ν λΉμ νμ§ μκ² νλ €λ©΄libgcc
κ° λ―Έλ¦¬ μ μ¬λΌ μλλ‘ ν΄μΌ νλ€.
νΉλ³ν λ§μ»€ μ΅μ
μ μ°μ§ μμΌλ©΄ μ¬λ³Ό μ΄λ¦μ μ»μ§ λͺ»ν μλ μλ€. GNU λ§μ»€λ₯Ό μ¬μ©νλ μμ€ν
μμλ -rdynamic
λ§μ»€ μ΅μ
μ μ¨μΌ νλ€. μ°Έκ³ λ‘ "static" ν¨μμ μ΄λ¦μ λ
ΈμΆλμ§ μμΌλ―λ‘ λ°±νΈλ μ΄μ€μ λμ€μ§ μλλ€.
μλ νλ‘κ·Έλ¨μ backtrace()
λ° backtrace_symbols()
μ μ¬μ© λ°©μμ λ³΄μ¬ μ€λ€. λ€μ μ
Έ μΈμ
μ νλ‘κ·Έλ¨ μ€ν μ λ³Ό μ μλ κ²°κ³Όμ΄λ€.
$ cc -rdynamic prog.c -o prog
$ ./prog 3
backtrace() returned 8 addresses
./prog(myfunc3+0x5c) [0x80487f0]
./prog [0x8048871]
./prog(myfunc+0x21) [0x8048894]
./prog(myfunc+0x1a) [0x804888d]
./prog(myfunc+0x1a) [0x804888d]
./prog(main+0x65) [0x80488fb]
/lib/libc.so.6(__libc_start_main+0xdc) [0xb7e38f9c]
./prog [0x8048711]
#include <execinfo.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#define BT_BUF_SIZE 100
void
myfunc3(void)
{
int j, nptrs;
void *buffer[BT_BUF_SIZE];
char **strings;
nptrs = backtrace(buffer, BT_BUF_SIZE);
printf("backtrace() returned %d addresses\n", nptrs);
/* backtrace_symbols_fd(buffer, nptrs, STDOUT_FILENO) νΈμΆ μ
λ€μ μ½λμ λΉμ·ν μΆλ ₯μ΄ λμ΄: */
strings = backtrace_symbols(buffer, nptrs);
if (strings == NULL) {
perror("backtrace_symbols");
exit(EXIT_FAILURE);
}
for (j = 0; j < nptrs; j++)
printf("%s\n", strings[j]);
free(strings);
}
static void /* "static"μ΄λ―λ‘ μ¬λ³Ό λ΄λ³΄μ΄μ§ μμ... */
myfunc2(void)
{
myfunc3();
}
void
myfunc(int ncalls)
{
if (ncalls > 1)
myfunc(ncalls - 1);
else
myfunc2();
}
int
main(int argc, char *argv[])
{
if (argc != 2) {
fprintf(stderr, "%s num-calls\n", argv[0]);
exit(EXIT_FAILURE);
}
myfunc(atoi(argv[1]));
exit(EXIT_SUCCESS);
}
addr2line(1), gcc(1)
, gdb(1), ld(1)
, dlopen(3), malloc(3)
2019-03-06