#include <qp0ztrc.h> void Qp0zDumpStack(const char *label);
The Qp0zDumpStack() function dumps a formatted representation of the call stack of the calling thread to the user trace. The formatted call stack is labeled with the text string specified by label. The formatted call stack shows the library, program, module, and procedure information associated with each frame on the call stack.
The formatted dump of the current call stack shows the oldest entries first, followed by newer entries.
The following example is a call stack dump if the Qp0zDumpStack() function is used to dump the stack of the current thread. The label Thread dumping my own stack was inserted by the application program using the label parameter.
The thread start routine in this example is threadfunc() in program or service program ATEST5 that resides in library QP0WTEST. The threadfunc() function (at statement 2) has called the function foo(). The function foo() (at statement 1), in turn has called bar(). The function bar() (at statement 1), has dumped the current call stack due to some application-specific error condition.
Thread dumping my own stack Library / Program Module Stmt Procedure QSYS / QLESPI QLECRTTH 7 : LE_Create_Thread2 QSYS / QP0WPTHR QP0WPTHR 974 : pthread_create_part2 QP0WTEST / ATEST5 ATEST5 2 : threadfunc QP0WTEST / ATEST5 ATEST5 1 : foo QP0WTEST / ATEST5 ATEST5 1 : bar QSYS / QP0ZCPA QP0ZUDBG 5 : Qp0zDumpStack QSYS / QP0ZSCPA QP0ZSCPA 199 : Qp0zSUDumpStack QSYS / QP0ZSCPA QP0ZSCPA 210 : Qp0zSUDumpTargetStack
An application should not use the tracing function in performance critical code. These functions are intended for debugging exception or error conditions. The user trace is a permanent user space object named QP0Z<jobnumber> in the QUSRSYS library. The user trace is created the first time any thread in a job writes trace output. See the Change User Trace (CHGUSRTRC), Dump User Trace (DMPUSRTRC) and Delete User Trace (DLTUSRTRC) CL commands for information about manipulating the user trace properties and objects.
None.
None.
If Qp0zDumpStack() is not successful, the function returns immediately and no error is indicated.
See Code disclaimer information for information pertaining to code examples.
The following example uses Qp0zDumpStack() and Qp0zUprintf() functions to produce trace output.
#define _MULTI_THREADED #include <pthread.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <qp0ztrc.h> #define THREADDATAMAX 128 void foo(char *string); void bar(char *string); void *theThread(void *parm) { char *myData = parm; printf("Entered the %s thread\n", myData); foo(myData); free(myData); return NULL; } void foo(char *string) { bar(string); } void bar(char *string) { Qp0zUprintf("function bar(): Hit an error condition!\n"); Qp0zDumpStack(string); } int main(int argc, char **argv) { pthread_t thread, thread2; int rc=0; char *threadData; printf("Enter Testcase - %s\n", argv[0]); Qp0zUprintf("Tracing Testcase Entry\n"); printf("Create two threads\n"); Qp0zUprintf("Tracing creation of two threads\n"); threadData = (char *)malloc(THREADDATAMAX); sprintf(threadData, "50%% Cotton, 50%% Polyester"); rc = pthread_create(&thread, NULL, theThread, threadData); if (rc) { printf("Failed to create a %s thread\n", threadData); exit(EXIT_FAILURE); } threadData = (char *)malloc(THREADDATAMAX); sprintf(threadData, "Lacquered Camel Hair"); rc = pthread_create(&thread2, NULL, theThread, threadData); if (rc) { printf("Failed to create a %s thread\n", threadData); exit(EXIT_FAILURE); } printf("Wait for threads to complete\n"); rc = pthread_join(thread, NULL); if (rc) { printf("Failed pthread_join() 1\n"); exit(EXIT_FAILURE); } rc = pthread_join(thread2, NULL); if (rc) { printf("Failed pthread_join() 2\n"); exit(EXIT_FAILURE); } printf("Testcase complete\n"); Qp0zUprintf("Tracing completion of the testcase rc=%d\n", rc); return 0; }
Trace Output:
This trace output was generated after the test case was run by using the CL command DMPUSRTRC JOB(100465/USER/TPZSTK0) OUTPUT(*STDOUT). The above example program ran as job 100465/USER/TPZSTK0.
Note the following in the trace output:
User Trace Dump for job 100465/USER/TPZSTK0. Size: 300K, Wrapped 0 times. --- 01/05/1998 16:32:23 --- 00000016:841456 Tracing Testcase Entry 00000016:842176 Tracing creation of two threads 00000017:850328 function bar(): Hit an error condition! 00000017:850552 Stack Dump For Current Thread 00000017:850752 Stack: 50% Cotton, 50% Polyester 00000018:853288 function bar(): Hit an error condition! 00000018:853512 Stack Dump For Current Thread 00000018:853712 Stack: Lacquered Camel Hair 00000018:888752 Stack: Library / Program Module Stmt Procedure 00000017:889400 Stack: Library / Program Module Stmt Procedure 00000017:904848 Stack: QSYS / QLESPI QLECRTTH 774 : LE_Create_Thread2__FP12crtth_parm_t 00000017:905088 Stack: QSYS / QP0WPTHR QP0WPTHR 1004 : pthread_create_part2 00000017:905312 Stack: QP0WTEST / TPZSTK0 TPZSTK0 2 : theThread 00000017:905528 Stack: QP0WTEST / TPZSTK0 TPZSTK0 1 : foo 00000017:905744 Stack: QP0WTEST / TPZSTK0 TPZSTK0 2 : bar 00000017:905960 Stack: QSYS / QP0ZCPA QP0ZUDBG 85 : Qp0zDumpStack 00000017:906184 Stack: QSYS / QP0ZSCPA QP0ZSCPA 274 : Qp0zSUDumpStack 00000017:906408 Stack: QSYS / QP0ZSCPA QP0ZSCPA 285 : Qp0zSUDumpTargetStack 00000017:906536 Stack: Completed 00000018:908504 Stack: QSYS / QLESPI QLECRTTH 774 : LE_Create_Thread2__FP12crtth_parm_t 00000018:908744 Stack: QSYS / QP0WPTHR QP0WPTHR 1004 : pthread_create_part2 00000018:908960 Stack: QP0WTEST / TPZSTK0 TPZSTK0 2 : theThread 00000018:909168 Stack: QP0WTEST / TPZSTK0 TPZSTK0 1 : foo 00000018:909384 Stack: QP0WTEST / TPZSTK0 TPZSTK0 2 : bar 00000018:909592 Stack: QSYS / QP0ZCPA QP0ZUDBG 85 : Qp0zDumpStack 00000018:909816 Stack: QSYS / QP0ZSCPA QP0ZSCPA 274 : Qp0zSUDumpStack 00000018:910032 Stack: QSYS / QP0ZSCPA QP0ZSCPA 285 : Qp0zSUDumpTargetStack 00000018:910168 Stack: Completed 00000016:912792 Tracing completion of the testcase rc=0 Press ENTER to end terminal session.
Top | UNIX-Type APIs | APIs by category |