Skip to content

Commit 3963bda

Browse files
committed
Attach to the process with the process PID
1 parent b752f5c commit 3963bda

File tree

4 files changed

+42
-7
lines changed

4 files changed

+42
-7
lines changed

src/arg.c

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,15 @@
77

88
int arg_opt_e = 0;
99
int arg_opt_p = 0;
10+
int arg_opt_o = 0;
1011
int arg_opt_m = 0;
1112
int arg_opt_s = 0;
1213
int arg_opt_v = 0;
1314
int arg_opt_n = 0;
1415

1516
char **arg_execve_argv = NULL;
1617
char *arg_popen = NULL;
18+
int arg_pid = -1;
1719

1820
char **parsing_execve_str(char *cmd)
1921
{
@@ -48,12 +50,13 @@ char **parsing_execve_str(char *cmd)
4850

4951
int help()
5052
{
51-
fprintf(stderr, "Usage: debug-server [-hmsvn] [-e CMD] [-p CMD]\n"
53+
fprintf(stderr, "Usage: debug-server [-hmsvn] [-e CMD] [-p PID] [-o CMD]\n"
5254
"\n"
5355
"debug-server " VERSION "\n"
5456
"General:\n"
5557
" -e CMD service argv\n"
56-
" -p CMD get pid by popen\n"
58+
" -p PID attach to PID\n"
59+
" -o CMD get pid by popen\n"
5760
" -h print help message\n"
5861
" -m enable multi-service\n"
5962
" -s halt at entry point\n"
@@ -66,14 +69,17 @@ int help()
6669
int parsing_argv(int argc, char *argv[])
6770
{
6871
int opt;
69-
while ((opt = getopt(argc, argv, "e:p:hmsvn")) != -1) {
72+
while ((opt = getopt(argc, argv, "e:p:o:hmsvn")) != -1) {
7073
switch (opt) {
7174
case 'e':
7275
arg_opt_e = 1;
7376
arg_execve_argv = parsing_execve_str(optarg);
7477
break;
7578
case 'p':
7679
arg_opt_p = 1;
80+
arg_pid = atoi(optarg);
81+
case 'o':
82+
arg_opt_o = 1;
7783
arg_popen = optarg;
7884
break;
7985
case 'h':
@@ -96,9 +102,9 @@ int parsing_argv(int argc, char *argv[])
96102
break;
97103
}
98104
}
99-
if(!(arg_opt_e || arg_opt_p))
105+
if(!(arg_opt_e || arg_opt_p || arg_opt_o))
100106
{
101-
fprintf(stderr, "debug-server: must have -e CMD or -p CMD\n");
107+
fprintf(stderr, "debug-server: must have -e CMD or -p PID or -o CMD\n");
102108
help();
103109
}
104110
return 0;

src/command.c

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,18 @@ int command_handler()
124124
if(gdb_client_address.sin6_family)
125125
{
126126
if(arg_opt_p)
127+
{
128+
pid = arg_pid;
129+
if(pid)
130+
{
131+
gdb_attached = gdbserver_attach_pid(pid);
132+
}
133+
else
134+
{
135+
warning_printf("There is an issue with the PID \"%s\".\n", arg_popen);
136+
}
137+
}
138+
else if(arg_opt_o)
127139
{
128140
pid = popen_to_int(arg_popen);
129141
if(pid)
@@ -159,6 +171,18 @@ int command_handler()
159171
break;
160172
case COMMAND_STRACE_ATTACH:
161173
if(arg_opt_p)
174+
{
175+
pid = arg_pid;
176+
if(pid)
177+
{
178+
strace_attach_pid(pid);
179+
}
180+
else
181+
{
182+
warning_printf("There is an issue with the PID \"%s\".\n", arg_popen);
183+
}
184+
}
185+
if(arg_opt_o)
162186
{
163187
pid = popen_to_int(arg_popen);
164188
if(pid)

src/debug-server.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
#define COMMAND_PORT 9545
66
#define GDBSERVER_PORT 9549
77

8-
#define VERSION "1.2.2"
8+
#define VERSION "1.3.0"
99

1010
#define COMMAND_GDB_REGISTER 0x01
1111
#define COMMAND_GDBSERVER_ATTACH 0x02
@@ -48,13 +48,15 @@ int strace_output(char *msg);
4848

4949
extern int arg_opt_e;
5050
extern int arg_opt_p;
51+
extern int arg_opt_o;
5152
extern int arg_opt_m;
5253
// halt at entry point
5354
extern int arg_opt_s;
5455
extern int arg_opt_v;
5556
extern int arg_opt_n;
5657
extern char **arg_execve_argv;
5758
extern char *arg_popen;
59+
extern int arg_pid;
5860

5961
int parsing_argv(int argc, char *argv[]);
6062

src/service.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,10 @@ int start_service(int client_sock)
133133

134134
CHECK(prctl(PR_SET_PDEATHSIG, SIGKILL, 0, 0, 0) != -1);
135135

136-
CHECK(prctl(PR_SET_PTRACER, PR_SET_PTRACER_ANY) != -1);
136+
if(prctl(PR_SET_PTRACER, PR_SET_PTRACER_ANY) == -1)
137+
{
138+
warning_printf("prctl(PR_SET_PTRACER, PR_SET_PTRACER_ANY) failed\n");
139+
}
137140

138141
if(client_sock > 0)
139142
{

0 commit comments

Comments
 (0)