| 
									
										
										
										
											2025-09-24 02:08:06 +02:00
										 |  |  | #!/usr/local/bin/bash -ex
 | 
					
						
							| 
									
										
										
										
											2025-10-05 03:04:53 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-09-24 02:08:06 +02:00
										 |  |  | # SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project | 
					
						
							|  |  |  | # SPDX-License-Identifier: GPL-3.0-or-later | 
					
						
							| 
									
										
										
										
											2025-10-05 03:04:53 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-09-24 02:08:06 +02:00
										 |  |  | # Basic script to run dtrace sampling over the program (requires Flamegraph) | 
					
						
							|  |  |  | # Usage is either running as: ./dtrace-tool.sh pid (then input the pid of the process) | 
					
						
							|  |  |  | # Or just run directly with: ./dtrace-tool.sh <command> | 
					
						
							| 
									
										
										
										
											2025-10-05 03:04:53 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-09-24 02:08:06 +02:00
										 |  |  | FLAMEGRAPH_DIR=".." | 
					
						
							| 
									
										
										
										
											2025-10-05 03:04:53 +02:00
										 |  |  | fail() { | 
					
						
							|  |  |  |     printf '%s\n' "$1" >&2 | 
					
						
							|  |  |  |     exit "${2-1}" | 
					
						
							| 
									
										
										
										
											2025-09-24 02:08:06 +02:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2025-10-05 03:04:53 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-09-24 02:08:06 +02:00
										 |  |  | [ -f $FLAMEGRAPH_DIR/FlameGraph/stackcollapse.pl ] || fail 'Where is flamegraph?' | 
					
						
							|  |  |  | #[ which dtrace ] || fail 'Needs DTrace installed' | 
					
						
							| 
									
										
										
										
											2025-10-05 03:04:53 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | read -r "Sampling Hz [800]: " TRACE_CFG_HZ | 
					
						
							| 
									
										
										
										
											2025-09-24 02:08:06 +02:00
										 |  |  | if [ -z "${TRACE_CFG_HZ}" ]; then | 
					
						
							| 
									
										
										
										
											2025-10-05 03:04:53 +02:00
										 |  |  |     TRACE_CFG_HZ=800 | 
					
						
							| 
									
										
										
										
											2025-09-24 02:08:06 +02:00
										 |  |  | fi | 
					
						
							| 
									
										
										
										
											2025-10-05 03:04:53 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | read -r "Sampling time [5] sec: " TRACE_CFG_TIME | 
					
						
							| 
									
										
										
										
											2025-09-24 02:08:06 +02:00
										 |  |  | if [ -z "${TRACE_CFG_TIME}" ]; then | 
					
						
							| 
									
										
										
										
											2025-10-05 03:04:53 +02:00
										 |  |  |     TRACE_CFG_TIME=5 | 
					
						
							| 
									
										
										
										
											2025-09-24 02:08:06 +02:00
										 |  |  | fi | 
					
						
							| 
									
										
										
										
											2025-10-05 03:04:53 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-09-24 02:08:06 +02:00
										 |  |  | TRACE_FILE=dtrace-out.user_stacks | 
					
						
							|  |  |  | TRACE_FOLD=dtrace-out.fold | 
					
						
							|  |  |  | TRACE_SVG=dtrace-out.svg | 
					
						
							|  |  |  | ps | 
					
						
							| 
									
										
										
										
											2025-10-05 03:04:53 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | if [ "$1" = 'pid' ]; then | 
					
						
							|  |  |  |     read -r "PID: " TRACE_CFG_PID | 
					
						
							|  |  |  |     sudo echo 'Sudo!' | 
					
						
							| 
									
										
										
										
											2025-09-24 02:08:06 +02:00
										 |  |  | else | 
					
						
							| 
									
										
										
										
											2025-10-05 03:04:53 +02:00
										 |  |  |     if [ -f "$1" ] && [ "$1" ]; then | 
					
						
							|  |  |  |     	fail 'Usage: ./tools/dtrace-profile.sh <path to program>' | 
					
						
							|  |  |  |     fi | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     printf "Executing: " | 
					
						
							|  |  |  |     echo "$@" | 
					
						
							|  |  |  |     sudo echo 'Sudo!' | 
					
						
							|  |  |  |     "$@" & | 
					
						
							|  |  |  |     TRACE_CFG_PID=$! | 
					
						
							| 
									
										
										
										
											2025-09-24 02:08:06 +02:00
										 |  |  | fi | 
					
						
							| 
									
										
										
										
											2025-10-05 03:04:53 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-09-24 02:08:06 +02:00
										 |  |  | TRACE_PROBE="profile-${TRACE_CFG_HZ} /pid == ${TRACE_CFG_PID} && arg1/ { @[ustack()] = count(); } tick-${TRACE_CFG_TIME}s { exit(0); }" | 
					
						
							| 
									
										
										
										
											2025-10-05 03:04:53 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-09-24 02:08:06 +02:00
										 |  |  | rm -- $TRACE_SVG || echo 'Skip' | 
					
						
							| 
									
										
										
										
											2025-10-05 03:04:53 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-09-24 02:08:06 +02:00
										 |  |  | sudo dtrace -x ustackframes=100 -Z -n "$TRACE_PROBE" -o $TRACE_FILE 2>/dev/null || exit | 
					
						
							| 
									
										
										
										
											2025-10-05 03:04:53 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-09-24 02:08:06 +02:00
										 |  |  | perl $FLAMEGRAPH_DIR/FlameGraph/stackcollapse.pl $TRACE_FILE > $TRACE_FOLD || exit | 
					
						
							|  |  |  | perl $FLAMEGRAPH_DIR/FlameGraph/flamegraph.pl $TRACE_FOLD > $TRACE_SVG || exit | 
					
						
							| 
									
										
										
										
											2025-10-05 03:04:53 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-09-24 02:08:06 +02:00
										 |  |  | sudo chmod 0666 $TRACE_FILE | 
					
						
							|  |  |  | rm -- $TRACE_FILE $TRACE_FOLD |