ibm-information-center/dist/eclipse/plugins/i5OS.ic.apis_5.4.0.1/p0zdmps.htm

348 lines
11 KiB
HTML
Raw Permalink Normal View History

2024-04-02 14:02:31 +00:00
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="Copyright" content="Copyright (c) 2006 by IBM Corporation">
<title>Qp0zDumpStack()--Dump Formatted Stack Trace Data</title>
<!-- Begin Header Records ========================================== -->
<!-- All rights reserved. Licensed Materials Property of IBM -->
<!-- US Government Users Restricted Rights -->
<!-- Use, duplication or disclosure restricted by -->
<!-- GSA ADP Schedule Contract with IBM Corp. -->
<!-- Change History: -->
<!-- YYMMDD USERID Change description -->
<!-- Direct1 SCRIPT J converted by B2H R4.1 (346) (CMS) by V2KEA304 -->
<!-- at RCHVMW2 on 17 Feb 1999 at 11:05:09 -->
<!-- Edited by Kersten Feb 02 -->
<!-- This file has undergone html cleanup May 2002 by JET -->
<!-- End Header Records -->
<link rel="stylesheet" type="text/css" href="../rzahg/ic.css">
</head>
<body>
<!-- Java sync-link -->
<script type="text/javascript" language="Javascript" src="../rzahg/synch.js">
</script>
<a name="Top_Of_Page"></a>
<h2>Qp0zDumpStack()--Dump Formatted Stack Trace Data</h2>
<div class="box" style="width: 60%;">
<br>
&nbsp;&nbsp;Syntax<br>
<pre>
#include &lt;qp0ztrc.h&gt;
void Qp0zDumpStack(const char <em>*label</em>);
</pre>
<br>
&nbsp;&nbsp;Service Program Name: QP0ZCPA<br>
<!-- iddvc RMBR -->
<br>
&nbsp;&nbsp;Default Public Authority: *USE<br>
<!-- iddvc RMBR -->
<br>
&nbsp;&nbsp;Threadsafe: Yes<br>
<!-- iddvc RMBR -->
<br>
</div>
<p>The <strong>Qp0zDumpStack()</strong> 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 <em>
label</em>. The formatted call stack shows the library, program, module, and
procedure information associated with each frame on the call stack.</p>
<p>The formatted dump of the current call stack shows the oldest entries first,
followed by newer entries.</p>
<p>The following example is a call stack dump if the <strong>
Qp0zDumpStack()</strong> function is used to dump the stack of the current
thread. The label <em>Thread dumping my own stack</em> was inserted by the
application program using the <em>label</em> parameter.</p>
<p>The thread start routine in this example is <strong>threadfunc()</strong> in
program or service program ATEST5 that resides in library QP0WTEST. The
<strong>threadfunc()</strong> function (at statement 2) has called the function
<strong>foo()</strong>. The function <strong>foo()</strong> (at statement 1),
in turn has called <strong>bar()</strong>. The function <strong>bar()</strong>
(at statement 1), has dumped the current call stack due to some
application-specific error condition.</p>
<pre>
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
</pre>
<p>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 <em>
QP0Z&lt;jobnumber&gt;</em> 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.</p>
<h3>Parameters</h3>
<dl>
<dt><strong>label</strong></dt>
<dd>(Input) A pointer to a string that is used to label the stack dump.</dd>
</dl>
<br>
<em>Authorities</em>
<p>None.</p>
<br>
<h3>Return Value</h3>
<p>None.</p>
<br>
<h3>Error Conditions</h3>
<p>If <strong>Qp0zDumpStack()</strong> is not successful, the function returns
immediately and no error is indicated.</p>
<br>
<h3>Usage Notes</h3>
<ol>
<li>No locks are held on the user trace between calls to the tracing functions.
The user trace can be deleted while in use. The next function that produces
trace output will create the user trace again.<br>
<br>
</li>
<li>If another job on the system has the same job number as an existing user
trace, the existing trace data is cleared, and the trace data from the new job
replaces it.<br>
<br>
</li>
<li>If the calling thread has more than 128 call stack entries, <strong>
Qp0zDumpStack()</strong> returns after dumping the first 128 entries of the
call stack.<br>
<br>
</li>
<li>As the format of the user trace records can change, only the following CL
commands can be used to manipulate the user trace properties and objects:<br>
<br>
<ul>
<li>Change User Trace (CHGUSRTRC) can be used to change the characteristics of
the user trace.<br>
<br>
</li>
<li>Dump User Trace (DMPUSRTRC) can be used to dump trace records to a file or
to standard output.<br>
<br>
</li>
<li>Delete User Trace (DLTUSRTRC) can be used to delete the user trace
objects.</li>
</ul>
</li>
</ol>
<br>
<h3>Related Information</h3>
<ul>
<li><a href="p0zdmp.htm">Qp0zDump()</a>--Dump Formatted Storage Trace Data<br>
<br>
</li>
<li><a href="p0zdmps.htm">Qp0zDumpTargetStack()</a>--Dump Formatted Stack Trace
Data of the Target Thread<br>
<br>
</li>
<li><a href="p0zlog.htm">Qp0zLprintf()</a>--Print Formatted Job Log Data<br>
<br>
</li>
<li><a href="p0zprnt.htm">Qp0zUprintf(</a>)--Print Formatted User Trace
Data</li>
</ul>
<br>
<h3>Example</h3>
<p>See <a href="../apiref/aboutapis.htm#codedisclaimer">Code disclaimer information</a>
for information pertaining to code examples.</p>
<p>The following example uses <strong>Qp0zDumpStack()</strong> and <strong>
Qp0zUprintf()</strong> functions to produce trace output.</p>
<pre>
#define _MULTI_THREADED
#include &lt;pthread.h&gt;
#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;unistd.h&gt;
#include &lt;qp0ztrc.h&gt;
#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(&amp;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(&amp;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;
}
</pre>
<p><strong>Trace Output:</strong></p>
<p>This trace output was generated after the test case was run by using the CL
command <strong>DMPUSRTRC JOB(100465/USER/TPZSTK0) OUTPUT(*STDOUT)</strong>.
The above example program ran as job 100465/USER/TPZSTK0.</p>
<p>Note the following in the trace output:</p>
<ol>
<li>Each trace record is indented by several spaces to aid in readability.
Trace records from different threads have different indentation levels.<br>
<br>
</li>
<li>Each trace record is identified by the hexadecimal thread ID, a colon, and
a timestamp. The timestamp can be used to aid in debugging of waiting or
looping threads. For example, the third trace record shown below, (the Tracing
Testcase Entry trace point) was created by thread 0x16, and occurred 0.841456
seconds after the last full date and time label. This means that the trace
record was created on 5 January 1998 at 16:32:23.841456. A full date and time
label is placed between those trace points that occur during different whole
seconds.</li>
</ol>
<br>
<br>
<pre>
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.
</pre>
<br>
<hr>
API introduced: V4R3
<hr>
<center>
<table cellpadding="2" cellspacing="2">
<tr align="center">
<td valign="middle" align="center"><a href="#Top_Of_Page">Top</a> | <a href=
"unix.htm">UNIX-Type APIs</a> | <a href="aplist.htm">APIs by category</a></td>
</tr>
</table>
</center>
</body>
</html>