Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
GHC
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Locked Files
Issues
4,270
Issues
4,270
List
Boards
Labels
Service Desk
Milestones
Iterations
Merge Requests
413
Merge Requests
413
Requirements
Requirements
List
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Security & Compliance
Security & Compliance
Dependency List
License Compliance
Operations
Operations
Incidents
Environments
Analytics
Analytics
CI / CD
Code Review
Insights
Issue
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Glasgow Haskell Compiler
GHC
Commits
ebf73311
Commit
ebf73311
authored
Feb 13, 2007
by
andy@galois.com
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Using RTS debug tracing support inside Hpc.c
parent
cac2aca1
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
66 additions
and
61 deletions
+66
-61
includes/RtsFlags.h
includes/RtsFlags.h
+1
-0
rts/Hpc.c
rts/Hpc.c
+57
-61
rts/RtsFlags.c
rts/RtsFlags.c
+5
-0
rts/Trace.c
rts/Trace.c
+1
-0
rts/Trace.h
rts/Trace.h
+2
-0
No files found.
includes/RtsFlags.h
View file @
ebf73311
...
...
@@ -62,6 +62,7 @@ struct DEBUG_FLAGS {
rtsBool
apply
;
/* 'a' */
rtsBool
stm
;
/* 'm' */
rtsBool
squeeze
;
/* 'z' stack squeezing & lazy blackholing */
rtsBool
hpc
;
/* 'c' coverage */
};
struct
COST_CENTRE_FLAGS
{
...
...
rts/Hpc.c
View file @
ebf73311
...
...
@@ -10,6 +10,7 @@
#include "Rts.h"
#include "Hpc.h"
#include "Trace.h"
#ifdef HAVE_UNISTD_H
#include <unistd.h>
...
...
@@ -21,7 +22,6 @@
*
*/
#define DEBUG_HPC 0
#define WOP_SIZE 1024
static
int
hpc_inited
=
0
;
// Have you started this component?
...
...
@@ -64,14 +64,13 @@ int totalTixes = 0; // total number of tix boxes.
static
char
*
tixFilename
;
static
void
failure
(
char
*
msg
)
{
debugTrace
(
DEBUG_hpc
,
"hpc failure: %s
\n
"
,
msg
);
fprintf
(
stderr
,
"Hpc failure: %s
\n
"
,
msg
);
fprintf
(
stderr
,
"(perhaps remove .tix file?)
\n
"
);
exit
(
-
1
);
}
static
int
init_open
(
char
*
filename
)
{
tixFile
=
fopen
(
filename
,
"r"
);
...
...
@@ -84,8 +83,7 @@ static int init_open(char *filename)
static
void
expect
(
char
c
)
{
if
(
tix_ch
!=
c
)
{
fprintf
(
stderr
,
"Hpc: parse failed (%c,%c)
\n
"
,
tix_ch
,
c
);
exit
(
-
1
);
failure
(
"parse error when reading .tix file"
);
}
tix_ch
=
getc
(
tixFile
);
}
...
...
@@ -208,9 +206,7 @@ hs_hpc_module(char *modName,int modCount,StgWord64 *tixArr) {
int
i
;
int
offset
=
0
;
#if DEBUG_HPC
fprintf
(
stderr
,
"hs_hpc_module(%s,%d)
\n
"
,
modName
,
modCount
);
#endif
debugTrace
(
DEBUG_hpc
,
"hs_hpc_module(%s,%d)"
,
modName
,
modCount
);
hpc_init
();
...
...
@@ -253,9 +249,8 @@ hs_hpc_module(char *modName,int modCount,StgWord64 *tixArr) {
lastModule
->
next
=
tmpModule
;
}
#if DEBUG_HPC
fprintf
(
stderr
,
"end: hs_hpc_module
\n
"
);
#endif
debugTrace
(
DEBUG_hpc
,
"end: hs_hpc_module"
);
return
offset
;
}
...
...
@@ -284,9 +279,9 @@ hs_hpc_thread_finished_event(StgTSO *current_tso) {
void
hs_hpc_tick
(
int
rixOp
,
StgTSO
*
current_tso
)
{
#if DEBUG_HPC
fprintf
(
stderr
,
"hs_hpc_tick(%x)
\n
"
,
rixOp
);
#endif
debugTrace
(
DEBUG_hpc
,
"hs_hpc_tick(%x)
"
,
rixOp
);
if
(
rixFile
==
NULL
)
{
return
;
}
...
...
@@ -314,32 +309,35 @@ hs_hpc_tick(int rixOp, StgTSO *current_tso) {
rixTidBack
[
rixCounter
%
WOP_SIZE
]
=
tid
;
rixCounter
++
;
#if DEBUG_HPC
fprintf
(
stderr
,
"end: hs_hpc_tick
\n
"
);
#endif
debugTrace
(
DEBUG_hpc
,
"end: hs_hpc_tick"
);
}
static
void
printEvent
(
FILE
*
out
,
StgWord64
rixCounter
,
StgThreadID
rixTid
,
HpcRixOp
rixOp
)
{
#if DEBUG_HPC
if
(
out
!=
stderr
)
{
printEvent
(
stderr
,
rixCounter
,
rixTid
,
rixOp
);
}
#endif
fprintf
(
out
,
"Event %"
PRIuWORD64
" %u "
,
rixCounter
,(
unsigned
int
)
rixTid
);
char
prefixMsg
[
128
];
char
suffixMsg
[
128
];
sprintf
(
prefixMsg
,
"Event %"
PRIuWORD64
" %u "
,
rixCounter
,
(
unsigned
int
)
rixTid
);
switch
(
rixOp
)
{
case
RixThreadFinishedOp
:
fprintf
(
out
,
"ThreadFinished
\n
"
);
sprintf
(
suffixMsg
,
"ThreadFinished
"
);
break
;
case
RixRaiseOp
:
fprintf
(
out
,
"Raise
\n
"
);
sprintf
(
suffixMsg
,
"Raise
"
);
break
;
case
RixFinishedOp
:
fprintf
(
out
,
"Finished
\n
"
);
sprintf
(
suffixMsg
,
"Finished
"
);
break
;
default:
fprintf
(
out
,
"%u
\n
"
,
rixOp
);
sprintf
(
suffixMsg
,
"%u
"
,
rixOp
);
}
fprintf
(
out
,
"%s%s
\n
"
,
prefixMsg
,
suffixMsg
);
debugTrace
(
DEBUG_hpc
,
"sending %s%s"
,
prefixMsg
,
suffixMsg
);
}
static
void
...
...
@@ -353,8 +351,11 @@ breakPointCommand(HpcRixOp rixOp, StgThreadID rixTid) {
return
;
}
debugTrace
(
DEBUG_hpc
,
"breakPointCommand %d %x"
,
rixOp
,(
unsigned
int
)
rixTid
);
printEvent
(
rixFile
,
rixCounter
,
rixTid
,
rixOp
);
fflush
(
rixFile
);
/* From here, you can ask some basic questions.
*
* c<nat> set the (one) counter breakpoint
...
...
@@ -375,9 +376,8 @@ breakPointCommand(HpcRixOp rixOp, StgThreadID rixTid) {
tmp64
=
tmp64
*
10
+
(
c
-
'0'
);
c
=
getc
(
rixCmdFile
);
}
#if DEBUG_HPC
fprintf
(
stderr
,
"setting countBP = %"
PRIuWORD64
"
\n
"
,
tmp64
);
#endif
debugTrace
(
DEBUG_hpc
,
"setting countBP = %"
PRIuWORD64
,
tmp64
);
rixBPCounter
=
tmp64
;
break
;
case
's'
:
// s2323 -- set tick box breakpoint at 2323
...
...
@@ -387,9 +387,9 @@ breakPointCommand(HpcRixOp rixOp, StgThreadID rixTid) {
tmp
=
tmp
*
10
+
(
c
-
'0'
);
c
=
getc
(
rixCmdFile
);
}
#if DEBUG_HPC
fprintf
(
stderr
,
"seting bp for tix %d
\n
"
,
tmp
);
#endif
debugTrace
(
DEBUG_hpc
,
"seting bp for tix %d
"
,
tmp
);
tixBoxBP
[
tmp
]
=
1
;
break
;
case
'u'
:
// u2323 -- unset tick box breakpoint at 2323
...
...
@@ -399,9 +399,9 @@ breakPointCommand(HpcRixOp rixOp, StgThreadID rixTid) {
tmp
=
tmp
*
10
+
(
c
-
'0'
);
c
=
getc
(
rixCmdFile
);
}
#if DEBUG_HPC
fprintf
(
stderr
,
"unseting bp for tix %d
\n
"
,
tmp
);
#endif
debugTrace
(
DEBUG_hpc
,
"unseting bp for tix %d
"
,
tmp
);
tixBoxBP
[
tmp
]
=
0
;
break
;
case
'h'
:
// h -- history of the last few (WOP_SIZE) steps
...
...
@@ -411,15 +411,18 @@ breakPointCommand(HpcRixOp rixOp, StgThreadID rixTid) {
tmp64
=
0
;
}
for
(;
tmp64
<
rixCounter
;
tmp64
++
)
{
printEvent
(
rixFile
,
tmp64
,
rixTidBack
[
tmp64
%
WOP_SIZE
],
rixOpBack
[
tmp64
%
WOP_SIZE
]);
printEvent
(
rixFile
,
tmp64
,
rixTidBack
[
tmp64
%
WOP_SIZE
],
rixOpBack
[
tmp64
%
WOP_SIZE
]);
}
fflush
(
rixFile
);
c
=
getc
(
rixCmdFile
);
break
;
default:
#if DEBUG_HPC
fprintf
(
stderr
,
"strange command from HPCRIX (%d)
\n
"
,
c
);
#endif
debugTrace
(
DEBUG_hpc
,
"strange command from HPCRIX (%d)
"
,
c
);
c
=
getc
(
rixCmdFile
);
}
while
(
c
!=
10
)
{
// the end of the line
...
...
@@ -427,9 +430,9 @@ breakPointCommand(HpcRixOp rixOp, StgThreadID rixTid) {
}
c
=
getc
(
rixCmdFile
);
// the first char on the next command
}
#if DEBUG_HPC
fprintf
(
stderr
,
"re entering program
\n
"
);
#endif
debugTrace
(
DEBUG_hpc
,
"leaving breakPointCommand
"
);
}
/* This is called after all the modules have registered their local tixboxes,
...
...
@@ -441,9 +444,7 @@ startupHpc(void) {
Info
*
tmpModule
;
char
*
hpcRix
;
#if DEBUG_HPC
fprintf
(
stderr
,
"startupHpc
\n
"
);
#endif
debugTrace
(
DEBUG_hpc
,
"startupHpc"
);
if
(
hpc_inited
==
0
)
{
return
;
...
...
@@ -476,13 +477,11 @@ startupHpc(void) {
if
(
sscanf
(
hpcRix
,
"%d:%d"
,
&
rixFD
,
&
rixCmdFD
)
!=
2
)
{
/* Bad format for HPCRIX.
*/
fprintf
(
stderr
,
"Bad HPCRIX (%s)
\n
"
,
hpcRix
);
debugTrace
(
DEBUG_hpc
,
"Bad HPCRIX (%s)
"
,
hpcRix
);
exit
(
0
);
}
#if DEBUG_HPC
fprintf
(
stderr
,
"found HPCRIX pipes: %d:%d
\n
"
,
rixFD
,
rixCmdFD
);
#endif
debugTrace
(
DEBUG_hpc
,
"found HPCRIX pipes: %d:%d"
,
rixFD
,
rixCmdFD
);
rixFile
=
fdopen
(
rixFD
,
"w"
);
assert
(
rixFile
!=
NULL
);
...
...
@@ -511,12 +510,12 @@ startupHpc(void) {
fprintf
(
rixFile
,
"(
\"
%s
\"
,%u)"
,
tmpModule
->
modName
,
tmpModule
->
tickCount
);
#if DEBUG_HPC
fprintf
(
stderr
,
"(tracer)%s: %u (offset=%u)
\n
"
,
debugTrace
(
DEBUG_hpc
,
"(tracer)%s: %u (offset=%u)
\n
"
,
tmpModule
->
modName
,
tmpModule
->
tickCount
,
tmpModule
->
tickOffset
);
#endif
}
fprintf
(
rixFile
,
"]
\n
"
);
fflush
(
rixFile
);
...
...
@@ -538,9 +537,7 @@ exitHpc(void) {
Info
*
tmpModule
;
int
i
,
comma
;
#if DEBUG_HPC
fprintf
(
stderr
,
"exitHpc
\n
"
);
#endif
debugTrace
(
DEBUG_hpc
,
"exitHpc"
);
if
(
hpc_inited
==
0
)
{
return
;
...
...
@@ -561,12 +558,10 @@ exitHpc(void) {
fprintf
(
f
,
"(
\"
%s
\"
,%u)"
,
tmpModule
->
modName
,
tmpModule
->
tickCount
);
#if DEBUG_HPC
fprintf
(
stderr
,
"%s: %u (offset=%u)
\n
"
,
debugTrace
(
DEBUG_hpc
,
"%s: %u (offset=%u)
\n
"
,
tmpModule
->
modName
,
tmpModule
->
tickCount
,
tmpModule
->
tickOffset
);
#endif
}
fprintf
(
f
,
"] ["
);
...
...
@@ -574,8 +569,9 @@ exitHpc(void) {
tmpModule
=
modules
;
for
(;
tmpModule
!=
0
;
tmpModule
=
tmpModule
->
next
)
{
if
(
!
tmpModule
->
tixArr
)
{
fprintf
(
stderr
,
"warning: module %s did not register any hpc tick data
\n
"
,
tmpModule
->
modName
);
debugTrace
(
DEBUG_hpc
,
"warning: module %s did not register any hpc tick data
\n
"
,
tmpModule
->
modName
);
}
for
(
i
=
0
;
i
<
tmpModule
->
tickCount
;
i
++
)
{
...
...
rts/RtsFlags.c
View file @
ebf73311
...
...
@@ -165,6 +165,7 @@ void initRtsFlagsDefaults(void)
RtsFlags
.
DebugFlags
.
par
=
rtsFalse
;
RtsFlags
.
DebugFlags
.
linker
=
rtsFalse
;
RtsFlags
.
DebugFlags
.
squeeze
=
rtsFalse
;
RtsFlags
.
DebugFlags
.
hpc
=
rtsFalse
;
#endif
#if defined(PROFILING) || defined(PAR)
...
...
@@ -427,6 +428,7 @@ usage_text[] = {
" -Dl DEBUG: linker"
,
" -Dm DEBUG: stm"
,
" -Dz DEBUG: stack squezing"
,
" -Dc DEBUG: program coverage"
,
""
,
#endif
/* DEBUG */
#if defined(THREADED_RTS) && !defined(NOSMP)
...
...
@@ -759,6 +761,9 @@ error = rtsTrue;
case
'z'
:
RtsFlags
.
DebugFlags
.
squeeze
=
rtsTrue
;
break
;
case
'c'
:
RtsFlags
.
DebugFlags
.
hpc
=
rtsTrue
;
break
;
default:
bad_option
(
rts_argv
[
arg
]
);
}
...
...
rts/Trace.c
View file @
ebf73311
...
...
@@ -76,6 +76,7 @@ void initTracing (void)
DEBUG_FLAG
(
par
,
DEBUG_par
);
DEBUG_FLAG
(
linker
,
DEBUG_linker
);
DEBUG_FLAG
(
squeeze
,
DEBUG_squeeze
);
DEBUG_FLAG
(
hpc
,
DEBUG_hpc
);
PAR_FLAG
(
verbose
,
PAR_DEBUG_verbose
);
PAR_FLAG
(
bq
,
PAR_DEBUG_bq
);
...
...
rts/Trace.h
View file @
ebf73311
...
...
@@ -108,6 +108,8 @@ void traceEnd (void);
// Profiling flags
#define TRACE_sched (1<<29)
// Coverge flags
#define DEBUG_hpc (1<<30)
// -----------------------------------------------------------------------------
// PRIVATE below here
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment