backtrace(3) - wariua/manpages-ko GitHub Wiki

NAME

backtrace, backtrace_symbols, backtrace_symbols_fd - μ‘μš© μ…€ν”„ 디버깅 지원

SYNOPSIS

#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);

DESCRIPTION

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λ₯Ό 보라.

RETURN VALUE

backtrace()λŠ” buffer둜 λ°˜ν™˜ν•˜λŠ” μ£Όμ†Œλ“€μ˜ 수λ₯Ό λ°˜ν™˜ν•˜λ©° κ·Έ 값은 size보닀 크지 μ•Šλ‹€. λ°˜ν™˜ 값이 size보닀 μž‘μ€ κ²½μš°μ—λŠ” 백트레이슀 전체가 μ €μž₯된 것이닀. size와 같은 κ²½μš°μ—λŠ” 일뢀가 μž˜λ Έμ„ μˆ˜λ„ 있으며, κ·Έ 경우 였래된 μŠ€νƒ ν”„λ ˆμž„λ“€μ˜ μ£Όμ†Œκ°€ λ°˜ν™˜λ˜μ§€ μ•ŠλŠ”λ‹€.

성곡 μ‹œ backtrace_symbols()λŠ” ν˜ΈμΆœμ—μ„œ malloc(3) ν•œ 배열에 λŒ€ν•œ 포인터λ₯Ό λ°˜ν™˜ν•œλ‹€. 였λ₯˜ μ‹œ NULL을 λ°˜ν™˜ν•œλ‹€.

ATTRIBUTES

이 μ ˆμ—μ„œ μ‚¬μš©ν•˜λŠ” μš©μ–΄λ“€μ— λŒ€ν•œ μ„€λͺ…은 attributes(7)λ₯Ό 보라.

μΈν„°νŽ˜μ΄μŠ€ 속성 κ°’
backtrace(),
backtrace_symbols(),
backtrace_symbols_fd()
μŠ€λ ˆλ“œ μ•ˆμ „μ„± MT-Safe

CONFORMING TO

이 ν•¨μˆ˜λ“€μ€ GNU ν™•μž₯이닀.

NOTES

이 ν•¨μˆ˜λ“€μ—μ„œλŠ” ν•¨μˆ˜μ˜ λ°˜ν™˜ μ£Όμ†Œκ°€ μŠ€νƒμ— μ €μž₯λ˜λŠ” 방식에 λŒ€ν•΄ λͺ‡ κ°€μ§€ 가정을 ν•œλ‹€. λ‹€μŒμ— μœ μ˜ν•˜λΌ.

  • (gcc(1)의 0 μ•„λ‹Œ μ΅œμ ν™” 단계듀에 ν•¨μ˜λœ) ν”„λ ˆμž„ 포인터 μƒλž΅μœΌλ‘œ 인해 κ·Έ 가정듀이 μœ„λ°°λ  수 μžˆλ‹€.

  • 인라인 처리 된 ν•¨μˆ˜μ—λŠ” μŠ€νƒ ν”„λ ˆμž„μ΄ μ—†λ‹€.

  • 꼬리 호좜 μ΅œμ ν™”κ°€ 이뀄지면 ν•œ μŠ€νƒ ν”„λ ˆμž„μ΄ λ‹€λ₯Έ ν”„λ ˆμž„μ„ λŒ€μ²΄ν•œλ‹€.

  • backtrace()와 backtrace_symbols_fd()μ—μ„œ malloc(3)을 λͺ…μ‹œμ μœΌλ‘œ ν˜ΈμΆœν•˜μ§€λŠ” μ•Šμ§€λ§Œ κ·Έ ν•¨μˆ˜λ“€μ΄ ν¬ν•¨λœ libgccκ°€ 졜초 μ‚¬μš© λ•Œ λ™μ μœΌλ‘œ μ μž¬λœλ‹€. 그리고 동적 μ μž¬λŠ” 일반적으둜 malloc(3) ν˜ΈμΆœμ„ μœ λ°œν•œλ‹€. 이 두 ν•¨μˆ˜μ— λŒ€ν•œ νŠΉμ • 호좜이 (κ°€λ Ή μ‹œκ·Έλ„ ν•Έλ“€λŸ¬ μ•ˆμ—μ„œ) λ©”λͺ¨λ¦¬ 할당을 ν•˜μ§€ μ•Šκ²Œ ν•˜λ €λ©΄ libgccκ°€ 미리 적재돼 μžˆλ„λ‘ ν•΄μ•Ό ν•œλ‹€.

νŠΉλ³„ν•œ 링컀 μ˜΅μ…˜μ„ μ“°μ§€ μ•ŠμœΌλ©΄ 심볼 이름을 μ–»μ§€ λͺ»ν•  μˆ˜λ„ μžˆλ‹€. GNU 링컀λ₯Ό μ‚¬μš©ν•˜λŠ” μ‹œμŠ€ν…œμ—μ„œλŠ” -rdynamic 링컀 μ˜΅μ…˜μ„ 써야 ν•œλ‹€. 참고둜 "static" ν•¨μˆ˜μ˜ 이름은 λ…ΈμΆœλ˜μ§€ μ•ŠμœΌλ―€λ‘œ λ°±νŠΈλ ˆμ΄μŠ€μ— λ‚˜μ˜€μ§€ μ•ŠλŠ”λ‹€.

EXAMPLE

μ•„λž˜ ν”„λ‘œκ·Έλž¨μ€ 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);
}

SEE ALSO

addr2line(1), gcc(1), gdb(1), ld(1), dlopen(3), malloc(3)


2019-03-06

⚠️ **GitHub.com Fallback** ⚠️