(root)/
glibc-2.38/
sysdeps/
pthread/
tst-backtrace1.c
       1  /* Copyright (C) 2004-2023 Free Software Foundation, Inc.
       2     This file is part of the GNU C Library.
       3  
       4     The GNU C Library is free software; you can redistribute it and/or
       5     modify it under the terms of the GNU Lesser General Public
       6     License as published by the Free Software Foundation; either
       7     version 2.1 of the License, or (at your option) any later version.
       8  
       9     The GNU C Library is distributed in the hope that it will be useful,
      10     but WITHOUT ANY WARRANTY; without even the implied warranty of
      11     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      12     Lesser General Public License for more details.
      13  
      14     You should have received a copy of the GNU Lesser General Public
      15     License along with the GNU C Library; if not, see
      16     <https://www.gnu.org/licenses/>.  */
      17  
      18  #include <execinfo.h>
      19  #include <pthread.h>
      20  #include <stdio.h>
      21  
      22  #define BT_SIZE 64
      23  void *bt_array[BT_SIZE];
      24  int bt_cnt;
      25  
      26  int
      27  do_bt (void)
      28  {
      29    bt_cnt = backtrace (bt_array, BT_SIZE);
      30    return 56;
      31  }
      32  
      33  int
      34  call_do_bt (void)
      35  {
      36    return do_bt () + 1;
      37  }
      38  
      39  void *
      40  tf (void *arg)
      41  {
      42    if (call_do_bt () != 57)
      43      return (void *) 1L;
      44    return NULL;
      45  }
      46  
      47  int
      48  do_test (void)
      49  {
      50    pthread_t th;
      51    if (pthread_create (&th, NULL, tf, NULL))
      52      {
      53        puts ("create failed");
      54        return 1;
      55      }
      56  
      57    void *res;
      58    if (pthread_join (th, &res))
      59      {
      60        puts ("join failed");
      61        return 1;
      62      }
      63  
      64    if (res != NULL)
      65      {
      66        puts ("thread failed");
      67        return 1;
      68      }
      69  
      70    char **text = backtrace_symbols (bt_array, bt_cnt);
      71    if (text == NULL)
      72      {
      73        puts ("backtrace_symbols failed");
      74        return 1;
      75      }
      76  
      77    for (int i = 0; i < bt_cnt; ++i)
      78      puts (text[i]);
      79  
      80    return 0;
      81  }
      82  
      83  #define TEST_FUNCTION do_test ()
      84  #include "../test-skeleton.c"