Post by Frank Ch. EiglerPost by Oleg Nesterov[...]
But, Jan. Implementing the memory writes does not mean breakpoints
automatically start to work!
It approximately should though.
Post by Oleg NesterovYes, gdb writes cc, and yes the tracee reports SIGTRAP. But after
that "continue" does nothing except "$c", and the tracee naturally
gets SIGILL. I expected that, since ugdb doesn't even know the code
was changed, gdb should write the original byte back before continue,
but this doesn't happen.
In normal all-stop mode,
Currently ugdb only supports non-stop
Post by Frank Ch. Eiglergdb does normally replace the old
instruction, in order to single-step over it with the 's' packet.
Yes, probably single-stepping is needed... I am still trying to
understand how this works with gdbserver, but I see vCont:s packets.
Post by Frank Ch. EiglerPerhaps you're testing some buggy non-stop aspect that only works
with 'Z' breakpoint management packets?
No. Just a trivial test-case which printfs in a loop.
Post by Frank Ch. EiglerA fuller packet trace
would help explain.
Please see below. But the only important part is:
$M4005ba,1:cc <------- set bp
$c <------- resume
of course, this can't work.
Full trace:
=> qSupported:multiprocess+
<= PacketSize=400;QStartNoAckMode+;QNonStop+;multiprocess+;QPassS...
=> QStartNoAckMode
<= OK
=> !
<= OK
=> Hgp0.0
<= E01
=> QNonStop:1
<= OK
=> qfThreadInfo
<= E01
=> ?
<= OK
=> qSymbol::
<=
=> vAttach;95b
<= OK
=> qfThreadInfo
<= mp95b.95b
=> qsThreadInfo
<= l
=> Hgp95b.95b
<= OK
=> vCont?
<= vCont;t
=> vCont;t:p95b.-1
<= OK
<= %Stop:T00thread:p95b.95b;
=> vStopped
<= OK
=> g
<= fcfdffffffffffff90ad5329ff7f0000ffffffffffffffff00000000000000...
=> m600880,8
<= 403c6d7d007f0000
=> m7f007d6d3c48,8
<= 00106d7d007f0000
=> m7f007d6d1000,28
<= 0000000000000000f6e04c7d007f0000e80760000000000080156d7d007f00...
=> m7f007d6d1580,28
<= 00f0ef29ff7f0000f6e04c7d007f000050f45f29ff7f000000c06c7d007f00...
=> m7f007d4ce0f4,4
<= 090a0069
=> m7f007d6cc000,28
<= 0030167d007f0000781f6d7d007f0000400b4b7d007f0000e8346d7d007f00...
=> m7f007d6d1f78,4
<= 2f6c6962
=> m7f007d6d1f7c,4
<= 2f6c6962
=> m7f007d6d1f80,4
<= 632e736f
=> m7f007d6d1f84,4
<= 2e360000
=> m7f007d6d34e8,28
<= 00704b7d007f00000002400000000000082e6d7d007f000000000000000000...
=> m400200,4
<= 2f6c6962
=> m400204,4
<= 2f6c642d
=> m400208,4
<= 6c696e75
=> m40020c,4
<= 782d7838
=> m400210,4
<= 362d3634
=> m400214,4
<= 2e736f2e
=> m400218,4
<= 32000000
=> m7f007d6d3c40,4
<= 01000000
=> m7f007d6d3c48,8
<= 00106d7d007f0000
=> m7f007d6d3c50,8
<= c04e4c7d007f0000
=> Z0,7f007d4c4ec0,1
<=
=> m7f007d4c4ec0,1
<= f3
=> X7f007d4c4ec0,0:
<=
=> M7f007d4c4ec0,1:cc
<= OK
=> m600880,8
<= 403c6d7d007f0000
=> m7f007d6d3c48,8
<= 00106d7d007f0000
=> m7f007d6d1000,28
<= 0000000000000000f6e04c7d007f0000e80760000000000080156d7d007f00...
=> m7f007d6d1580,28
<= 00f0ef29ff7f0000f6e04c7d007f000050f45f29ff7f000000c06c7d007f00...
=> m7f007d4ce0f4,4
<= 090a0069
=> m7f007d6cc000,28
<= 0030167d007f0000781f6d7d007f0000400b4b7d007f0000e8346d7d007f00...
=> m7f007d6d1f78,4
<= 2f6c6962
=> m7f007d6d1f7c,4
<= 2f6c6962
=> m7f007d6d1f80,4
<= 632e736f
=> m7f007d6d1f84,4
<= 2e360000
=> m7f007d6d34e8,28
<= 00704b7d007f00000002400000000000082e6d7d007f000000000000000000...
=> m400200,4
<= 2f6c6962
=> m400204,4
<= 2f6c642d
=> m400208,4
<= 6c696e75
=> m40020c,4
<= 782d7838
=> m400210,4
<= 362d3634
=> m400214,4
<= 2e736f2e
=> m400218,4
<= 32000000
=> m7f007d6d3c40,4
<= 01000000
=> vCont;t:p95b.-1
<= OK
=> m7f007d201f40,1
<= 48
=> m7f007d201f40,1
<= 48
=> g
<= fcfdffffffffffff90ad5329ff7f0000ffffffffffffffff00000000000000...
=> m7f007d201f40,1
<= 48
=> m7f007d201f40,1
<= 48
=> m40056c,12
<= 554889e5e8e3feffff89c6ba07000000bfdc
=> m40056c,1
<= 55
=> m40056d,3
<= 4889e5
=> m40056c,12
<= 554889e5e8e3feffff89c6ba07000000bfdc
=> m40056c,1
<= 55
=> m40056d,3
<= 4889e5
=> m4005ba,1
<= e8
=> m4005ba,1
<= e8
(gdb) b BP.c:13
Breakpoint 1 at 0x4005ba: file BP.c, line 13.
=> M4005ba,1:cc
<= OK
gdb writes "int 3".
(gdb) c
Continuing.
=> QPassSignals:e;10;14;17;1a;1b;1c;21;24;25;4c;
<= OK
=> Hcp95b.95b
<= OK
=> c
<= OK
<= %Stop:T05thread:p95b.95b;
the tracee hits this bp and reports SIGTRAP
=> vStopped
<= OK
=> g
<= 00000000000000000006400000000000401f207d007f000000000000000000...
=> P10=ba05400000000000
<=
=> G00000000000000000006400000000000401f207d007f00000000000000000...
<=
=> m4005ba,1
<= cc
=> m4005ba,1
<= cc
=> g
<= 00000000000000000006400000000000401f207d007f000000000000000000...
=> m4005bb,1
<= 99
=> m4005bb,1
<= 99
Breakpoint 1, main () at BP.c:13
13 printf("THREE %d %d\n\n", getpid(), __LINE__);
(gdb) c
Continuing.
=> c
<= OK
gdb just resumes the tracee,
<= %Stop:T04thread:p95b.95b;
and of course it gets SIGILL after "int 3"
=> vStopped
<= OK
=> g
<= 00000000000000000006400000000000401f207d007f000000000000000000...
=> m4005bc,1
<= fe
=> m4005bc,1
<= fe
=> g
<= 00000000000000000006400000000000401f207d007f000000000000000000...
=> m4005bc,1
<= fe
=> m4005bc,1
<= fe
=> qTStatus
<= T0
=> M4005ba,1:e8
<= OK
=> M7f007d4c4ec0,1:f3
<= OK
=> D;95b
<= OK
=> qTStatus
<= T0