Index: uspace/app/trace/trace.c
===================================================================
--- uspace/app/trace/trace.c	(revision 164385528bfca082a12eee5e01b23c2c9a74acc5)
+++ uspace/app/trace/trace.c	(revision 47e0a05baa886b025c008b7e51748be0a29cd784)
@@ -42,4 +42,5 @@
 #include <udebug.h>
 #include <async.h>
+#include <task.h>
 
 // Temporary: service and method names
@@ -129,5 +130,5 @@
 	printf("Threads:");
 	for (i = 0; i < n_threads; i++) {
-		printf(" [%d] (hash 0x%u)", 1+i, thread_hash_buf[i]);
+		printf(" [%d] (hash 0x%x)", 1+i, thread_hash_buf[i]);
 	}
 	printf("\ntotal of %u threads\n", tb_needed/sizeof(unsigned));
@@ -541,5 +542,7 @@
 static void print_syntax()
 {
-	printf("Syntax: trace [+<events>] <task_id>\n");
+	printf("Syntax:\n");
+	printf("\ttrace [+<events>] <executable> [<arg1> [...]]\n");
+	printf("or\ttrace [+<events>] -t <task_id>\n");
 	printf("Events: (default is +tp)\n");
 	printf("\n");
@@ -549,5 +552,7 @@
 	printf("\tp ... Protocol level\n");
 	printf("\n");
-	printf("Example: trace +tsip 12\n");
+	printf("Examples:\n");
+	printf("\ttrace +s /app/tetris\n");
+	printf("\ttrace +tsip -t 12\n");
 }
 
@@ -581,14 +586,29 @@
 	char *err_p;
 
+	task_id = 0;
+
 	--argc; ++argv;
 
-	while (argc > 1) {
+	while (argc > 0) {
 		arg = *argv;
 		if (arg[0] == '+') {
 			display_mask = parse_display_mask(&arg[1]);
+		} else if (arg[0] == '-') {
+			if (arg[1] == 't') {
+				/* Trace an already running task */
+				--argc; ++argv;
+				task_id = strtol(*argv, &err_p, 10);
+				if (*err_p) {
+					printf("Task ID syntax error\n");
+					print_syntax();
+					return -1;
+				}
+			} else {
+				printf("Uknown option '%s'\n", arg[0]);
+				print_syntax();
+				return -1;
+			}
 		} else {
-			printf("Unexpected argument '%s'\n", arg);
-			print_syntax();
-			return -1;
+			break;
 		}
 
@@ -596,17 +616,24 @@
 	}
 
-	if (argc != 1) {
+	if (task_id != 0) {
+		if (argc == 0) return;
+		printf("Extra arguments\n");
+		print_syntax();
+		return -1;
+	}
+
+	if (argc < 1) {
 		printf("Missing argument\n");
 		print_syntax();
-		return 1;
-	}
-
-	task_id = strtol(*argv, &err_p, 10);
-
-	if (*err_p) {
-		printf("Task ID syntax error\n");
-		print_syntax();
 		return -1;
 	}
+
+	/* Execute the specified command and trace the new task. */
+	printf("Spawning '%s' with arguments:\n", *argv);
+	{
+		char **cp = argv;
+		while (*cp) printf("'%s'\n", *cp++);
+	}
+	task_id = task_spawn(*argv, argv);
 
 	return 0;
