.\" -*- coding: UTF-8 -*- '\" t .\" Copyright (C) 2007 Michael Kerrisk .\" drawing on material by Justin Pryzby .\" .\" %%%LICENSE_START(PERMISSIVE_MISC) .\" Permission is hereby granted, free of charge, to any person obtaining .\" a copy of this software and associated documentation files (the .\" "Software"), to deal in the Software without restriction, including .\" without limitation the rights to use, copy, modify, merge, publish, .\" distribute, sublicense, and/or sell copies of the Software, and to .\" permit persons to whom the Software is furnished to do so, subject to .\" the following conditions: .\" .\" The above copyright notice and this permission notice shall be .\" included in all copies or substantial portions of the Software. .\" .\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, .\" EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF .\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. .\" IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY .\" CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, .\" TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE .\" SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. .\" %%%LICENSE_END .\" .\" References: .\" glibc manual and source .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH backtrace 3 "15 iunie 2024" "Pagini de manual de Linux 6.9.1" .SH NUME backtrace, backtrace_symbols, backtrace_symbols_fd \- suport pentru auto\-depanarea aplicației .SH BIBLIOTECA Biblioteca C standard (\fIlibc\fP, \fI\-lc\fP) .SH SINOPSIS .nf \fB#include \fP .P \fBint backtrace(void *\fP\fIbuffer\fP\fB[.\fP\fIsize\fP\fB], int \fP\fIsize\fP\fB);\fP .P \fBchar **backtrace_symbols(void *const \fP\fIbuffer\fP\fB[.\fP\fIsize\fP\fB], int \fP\fIsize\fP\fB);\fP \fBvoid backtrace_symbols_fd(void *const \fP\fIbuffer\fP\fB[.\fP\fIsize\fP\fB], int \fP\fIsize\fP\fB, int \fP\fIfd\fP\fB);\fP .fi .SH DESCRIERE \fBbacktrace\fP() returnează un traseu de urmărire pentru programul apelant, în matricea indicată de \fIbuffer\fP. Un traseu de urmărire reprezintă seria de apeluri de funcții active în acel moment pentru program. Fiecare element din matricea indicată de \fIbuffer\fP este de tip \fIvoid\ *\fP și reprezintă adresa de returnare din cadrul stivei corespunzătoare. Argumentul \fIsize\fP specifică numărul maxim de adrese care pot fi stocate în \fIbuffer\fP. Dacă traseul de urmărire este mai mare decât \fIsize\fP, atunci sunt returnate adresele corespunzătoare celor mai recente apeluri de funcție \fIsize\fP; pentru a obține traseul complet, asigurați\-vă că \fIbuffer\fP și \fIsize\fP sunt suficient de mari. .P Având în vedere setul de adrese returnate de \fBbacktrace\fP() în \fIbuffer\fP, \fBbacktrace_symbols\fP() traduce adresele într\-o matrice de șiruri care descriu simbolic adresele. Argumentul \fIsize\fP specifică numărul de adrese din \fIbuffer\fP. Reprezentarea simbolică a fiecărei adrese constă în numele funcției (dacă acesta poate fi determinat), un decalaj hexazecimal în interiorul funcției și adresa reală de returnare (în hexazecimal). Adresa matricei de indicatori de șiruri este returnată ca rezultat al funcției \fBbacktrace_symbols\fP(). Această matrice este alocată în memorie „\fBmalloc\fP(3)” de \fBbacktrace_symbols\fP() și trebuie eliberată de către apelant; (șirurile indicate de matricea de indicatori nu au nevoie și nu trebuie să fie eliberate). .P \fBbacktrace_symbols_fd\fP() primește aceleași argumente \fIbuffer\fP și \fIsize\fP ca și \fBbacktrace_symbols\fP(), dar în loc să returneze o matrice de șiruri către apelant, scrie șirurile, câte unul pe linie, în descriptorul de fișier \fIfd\fP. \fBbacktrace_symbols_fd\fP() nu apelează \fBmalloc\fP(3) și, prin urmare, poate fi utilizată în situații în care această din urmă funcție ar putea eșua, dar a se vedea secțiunea NOTE. .SH "VALOAREA RETURNATĂ" \fBbacktrace\fP() returnează numărul de adrese returnate în \fIbuffer\fP, care nu este mai mare decât \fIsize\fP. Dacă valoarea returnată este mai mică decât \fIsize\fP, atunci a fost stocat întregul traseu de urmărire; dacă este egală cu \fIsize\fP, atunci este posibil să fi fost trunchiat, caz în care adresele celor mai vechi cadre din stivă nu sunt returnate. .P În caz de succes, \fBbacktrace_symbols\fP() returnează un indicator la matricea \fBmalloc\fP(3) creată prin apel; în caz de eroare, se returnează NULL. .SH ATRIBUTE Pentru o explicație a termenilor folosiți în această secțiune, a se vedea \fBattributes\fP(7). .TS allbox; lbx lb lb l l l. Interfață Atribut Valoare T{ .na .nh \fBbacktrace\fP(), \fBbacktrace_symbols\fP(), \fBbacktrace_symbols_fd\fP() T} Siguranța firelor MT\-Safe .TE .SH STANDARDE GNU. .SH ISTORIC glibc 2.1. .SH NOTE Aceste funcții fac unele presupuneri cu privire la modul în care adresa de returnare a unei funcții este stocată în stivă. Rețineți următoarele: .IP \[bu] 3 Omiterea indicatorilor de cadre (așa cum implică oricare dintre nivelurile de optimizare diferite de zero ale \fBgcc\fP(1)) poate duce la încălcarea acestor presupuneri. .IP \[bu] Funcțiile inserate în linie „inlined” nu au cadre de stivă. .IP \[bu] Optimizarea apelului din coadă „tail\-call” face ca un cadru de stivă să înlocuiască un altul. .IP \[bu] \fBbacktrace\fP() și \fBbacktrace_symbols_fd\fP() nu apelează explicit \fBmalloc\fP(), dar fac parte din \fIlibgcc\fP, care se încarcă dinamic la prima utilizare. Încărcarea dinamică declanșează, de obicei, un apel la \fBmalloc\fP(3). Dacă aveți nevoie ca anumite apeluri la aceste două funcții să nu aloce memorie (în gestionarii de semnal, de exemplu), trebuie să vă asigurați că \fIlibgcc\fP este încărcată în prealabil. .P Este posibil ca numele simbolurilor să nu fie disponibile fără utilizarea unor opțiuni speciale ale editorului de legături. Pentru sistemele care utilizează editorul de legături GNU, este necesar să se utilizeze opțiunea \fI\-rdynamic\fP. Rețineți că numele funcțiilor „statice” nu sunt expuse și nu vor fi disponibile în traseul de urmărire. .SH EXEMPLE Programul de mai jos demonstrează utilizarea \fBbacktrace\fP() și \fBbacktrace_symbols\fP(). Următoarea sesiune shell arată ce am putea vedea la rularea programului: .P .in +4n .EX $\fB cc \-rdynamic prog.c \-o prog\fP $\fB ./prog 3\fP backtrace() a returnat 8 adrese \&./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] .EE .in .SS "Sursa programului" .\" SRC BEGIN (backtrace.c) \& .EX #include #include #include #include \& #define BT_BUF_SIZE 100 \& void myfunc3(void) { int nptrs; void *buffer[BT_BUF_SIZE]; char **strings; \& nptrs = backtrace(buffer, BT_BUF_SIZE); printf("backtrace() a returnat %d adree\[rs]n", nptrs); \& /* Apelul backtrace_symbols_fd(buffer, nptrs, STDOUT_FILENO) ar produce o ieșire similară cu cea de mai jos: */ \& strings = backtrace_symbols(buffer, nptrs); if (strings == NULL) { perror("backtrace_symbols"); exit(EXIT_FAILURE); } \& for (size_t j = 0; j < nptrs; j++) printf("%s\[rs]n", strings[j]); \& free(strings); } \& static void /* „static” înseamnă că nu exportă simbolul... */ 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\[rs]n", argv[0]); exit(EXIT_FAILURE); } \& myfunc(atoi(argv[1])); exit(EXIT_SUCCESS); } .EE .\" SRC END .SH "CONSULTAȚI ȘI" \fBaddr2line\fP(1), \fBgcc\fP(1), \fBgdb\fP(1), \fBld\fP(1), \fBdlopen\fP(3), \fBmalloc\fP(3) .PP .SH TRADUCERE Traducerea în limba română a acestui manual a fost făcută de Remus-Gabriel Chelu . .PP Această traducere este documentație gratuită; citiți .UR https://www.gnu.org/licenses/gpl-3.0.html Licența publică generală GNU Versiunea 3 .UE sau o versiune ulterioară cu privire la condiții privind drepturile de autor. NU se asumă NICIO RESPONSABILITATE. .PP Dacă găsiți erori în traducerea acestui manual, vă rugăm să trimiteți un e-mail la .MT translation-team-ro@lists.sourceforge.net .ME .