GDBRegisterChangedEvent.st
author Jan Vrany <jan.vrany@labware.com>
Thu, 07 Dec 2023 12:33:31 +0000
changeset 322 1b26d0a9560c
parent 316 7cc3798b2ff7
permissions -rw-r--r--
Emit and handle (custom) `-register-changed` notification This commit adds new (custom) asynchronous notification about register value being changed. Standard GDB does not notify MI clients about register value being changed when debugging (for example, by CLI command `set $rax = 1` or via Python's `Value.assign()`). This caused libgdb's register value cache being out of sync. In the past, this was partially worked around by manually emiting the notification on `GDBRegisterWithValue` APIs, but this did not (and could not) handle the case register was changed from GDB command line. To solve this problem, this commit installs a custom Python event handler that emits new GDB/MI notification - `-register-changed` - whenever a register changes after debugee is stopped. This has been enabled by upstream GDB commit 4825fd "gdb/python: implement support for sending custom MI async notifications" On libgdbs side, complete inferior state is invalidated. In theory, one could carefully invalidate only the changed `GDBRegisterWithValue` but in certain cases this could also change the backtrace (for example, if one updates stack pointer) or position in code. So it seems safer to just invalidate everything.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
249
272bd60a849c When setting register value via API, send `GDBRegisterValueChangedEvent`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
     1
"
272
cdd1c9ad00de Change class categories to facilitate Pharo port
Jan Vrany <jan.vrany@labware.com>
parents: 259
diff changeset
     2
COPYRIGHT (c) 2021-2023 LabWare
249
272bd60a849c When setting register value via API, send `GDBRegisterValueChangedEvent`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
     3
jv:libgdbs - GNU Debugger Interface Library
272bd60a849c When setting register value via API, send `GDBRegisterValueChangedEvent`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
     4
259
651864c2aa29 Relicense under MIT license.
Jan Vrany <jan.vrany@labware.com>
parents: 249
diff changeset
     5
Permission is hereby granted, free of charge, to any person obtaining a copy
651864c2aa29 Relicense under MIT license.
Jan Vrany <jan.vrany@labware.com>
parents: 249
diff changeset
     6
of this software and associated documentation files (the 'Software'), to deal
651864c2aa29 Relicense under MIT license.
Jan Vrany <jan.vrany@labware.com>
parents: 249
diff changeset
     7
in the Software without restriction, including without limitation the rights
651864c2aa29 Relicense under MIT license.
Jan Vrany <jan.vrany@labware.com>
parents: 249
diff changeset
     8
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
651864c2aa29 Relicense under MIT license.
Jan Vrany <jan.vrany@labware.com>
parents: 249
diff changeset
     9
copies of the Software, and to permit persons to whom the Software is
651864c2aa29 Relicense under MIT license.
Jan Vrany <jan.vrany@labware.com>
parents: 249
diff changeset
    10
furnished to do so, subject to the following conditions:
249
272bd60a849c When setting register value via API, send `GDBRegisterValueChangedEvent`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
    11
259
651864c2aa29 Relicense under MIT license.
Jan Vrany <jan.vrany@labware.com>
parents: 249
diff changeset
    12
The above copyright notice and this permission notice shall be included in all
651864c2aa29 Relicense under MIT license.
Jan Vrany <jan.vrany@labware.com>
parents: 249
diff changeset
    13
copies or substantial portions of the Software.
249
272bd60a849c When setting register value via API, send `GDBRegisterValueChangedEvent`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
    14
259
651864c2aa29 Relicense under MIT license.
Jan Vrany <jan.vrany@labware.com>
parents: 249
diff changeset
    15
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
651864c2aa29 Relicense under MIT license.
Jan Vrany <jan.vrany@labware.com>
parents: 249
diff changeset
    16
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
651864c2aa29 Relicense under MIT license.
Jan Vrany <jan.vrany@labware.com>
parents: 249
diff changeset
    17
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
651864c2aa29 Relicense under MIT license.
Jan Vrany <jan.vrany@labware.com>
parents: 249
diff changeset
    18
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
651864c2aa29 Relicense under MIT license.
Jan Vrany <jan.vrany@labware.com>
parents: 249
diff changeset
    19
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
651864c2aa29 Relicense under MIT license.
Jan Vrany <jan.vrany@labware.com>
parents: 249
diff changeset
    20
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
651864c2aa29 Relicense under MIT license.
Jan Vrany <jan.vrany@labware.com>
parents: 249
diff changeset
    21
SOFTWARE.
249
272bd60a849c When setting register value via API, send `GDBRegisterValueChangedEvent`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
    22
"
272bd60a849c When setting register value via API, send `GDBRegisterValueChangedEvent`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
    23
"{ Package: 'jv:libgdbs' }"
272bd60a849c When setting register value via API, send `GDBRegisterValueChangedEvent`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
    24
272bd60a849c When setting register value via API, send `GDBRegisterValueChangedEvent`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
    25
"{ NameSpace: Smalltalk }"
272bd60a849c When setting register value via API, send `GDBRegisterValueChangedEvent`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
    26
322
1b26d0a9560c Emit and handle (custom) `-register-changed` notification
Jan Vrany <jan.vrany@labware.com>
parents: 316
diff changeset
    27
GDBNotificationEvent subclass:#GDBRegisterChangedEvent
1b26d0a9560c Emit and handle (custom) `-register-changed` notification
Jan Vrany <jan.vrany@labware.com>
parents: 316
diff changeset
    28
	instanceVariableNames:'frame regnum'
249
272bd60a849c When setting register value via API, send `GDBRegisterValueChangedEvent`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
    29
	classVariableNames:''
272bd60a849c When setting register value via API, send `GDBRegisterValueChangedEvent`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
    30
	poolDictionaries:''
272
cdd1c9ad00de Change class categories to facilitate Pharo port
Jan Vrany <jan.vrany@labware.com>
parents: 259
diff changeset
    31
	category:'GDB-Events'
249
272bd60a849c When setting register value via API, send `GDBRegisterValueChangedEvent`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
    32
!
272bd60a849c When setting register value via API, send `GDBRegisterValueChangedEvent`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
    33
316
7cc3798b2ff7 Rename `GDBRegisterValueChangedEvent` to `GDBRegisterChangedEvent`
Jan Vrany <jan.vrany@labware.com>
parents: 272
diff changeset
    34
!GDBRegisterChangedEvent class methodsFor:'documentation'!
249
272bd60a849c When setting register value via API, send `GDBRegisterValueChangedEvent`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
    35
272bd60a849c When setting register value via API, send `GDBRegisterValueChangedEvent`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
    36
copyright
272bd60a849c When setting register value via API, send `GDBRegisterValueChangedEvent`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
    37
"
272
cdd1c9ad00de Change class categories to facilitate Pharo port
Jan Vrany <jan.vrany@labware.com>
parents: 259
diff changeset
    38
COPYRIGHT (c) 2021-2023 LabWare
249
272bd60a849c When setting register value via API, send `GDBRegisterValueChangedEvent`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
    39
jv:libgdbs - GNU Debugger Interface Library
272bd60a849c When setting register value via API, send `GDBRegisterValueChangedEvent`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
    40
259
651864c2aa29 Relicense under MIT license.
Jan Vrany <jan.vrany@labware.com>
parents: 249
diff changeset
    41
Permission is hereby granted, free of charge, to any person obtaining a copy
651864c2aa29 Relicense under MIT license.
Jan Vrany <jan.vrany@labware.com>
parents: 249
diff changeset
    42
of this software and associated documentation files (the 'Software'), to deal
651864c2aa29 Relicense under MIT license.
Jan Vrany <jan.vrany@labware.com>
parents: 249
diff changeset
    43
in the Software without restriction, including without limitation the rights
651864c2aa29 Relicense under MIT license.
Jan Vrany <jan.vrany@labware.com>
parents: 249
diff changeset
    44
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
651864c2aa29 Relicense under MIT license.
Jan Vrany <jan.vrany@labware.com>
parents: 249
diff changeset
    45
copies of the Software, and to permit persons to whom the Software is
651864c2aa29 Relicense under MIT license.
Jan Vrany <jan.vrany@labware.com>
parents: 249
diff changeset
    46
furnished to do so, subject to the following conditions:
249
272bd60a849c When setting register value via API, send `GDBRegisterValueChangedEvent`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
    47
259
651864c2aa29 Relicense under MIT license.
Jan Vrany <jan.vrany@labware.com>
parents: 249
diff changeset
    48
The above copyright notice and this permission notice shall be included in all
651864c2aa29 Relicense under MIT license.
Jan Vrany <jan.vrany@labware.com>
parents: 249
diff changeset
    49
copies or substantial portions of the Software.
249
272bd60a849c When setting register value via API, send `GDBRegisterValueChangedEvent`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
    50
259
651864c2aa29 Relicense under MIT license.
Jan Vrany <jan.vrany@labware.com>
parents: 249
diff changeset
    51
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
651864c2aa29 Relicense under MIT license.
Jan Vrany <jan.vrany@labware.com>
parents: 249
diff changeset
    52
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
651864c2aa29 Relicense under MIT license.
Jan Vrany <jan.vrany@labware.com>
parents: 249
diff changeset
    53
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
651864c2aa29 Relicense under MIT license.
Jan Vrany <jan.vrany@labware.com>
parents: 249
diff changeset
    54
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
651864c2aa29 Relicense under MIT license.
Jan Vrany <jan.vrany@labware.com>
parents: 249
diff changeset
    55
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
651864c2aa29 Relicense under MIT license.
Jan Vrany <jan.vrany@labware.com>
parents: 249
diff changeset
    56
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
651864c2aa29 Relicense under MIT license.
Jan Vrany <jan.vrany@labware.com>
parents: 249
diff changeset
    57
SOFTWARE.
249
272bd60a849c When setting register value via API, send `GDBRegisterValueChangedEvent`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
    58
"
272bd60a849c When setting register value via API, send `GDBRegisterValueChangedEvent`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
    59
! !
272bd60a849c When setting register value via API, send `GDBRegisterValueChangedEvent`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
    60
322
1b26d0a9560c Emit and handle (custom) `-register-changed` notification
Jan Vrany <jan.vrany@labware.com>
parents: 316
diff changeset
    61
!GDBRegisterChangedEvent class methodsFor:'accessing - GDB value descriptors'!
249
272bd60a849c When setting register value via API, send `GDBRegisterValueChangedEvent`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
    62
322
1b26d0a9560c Emit and handle (custom) `-register-changed` notification
Jan Vrany <jan.vrany@labware.com>
parents: 316
diff changeset
    63
description
1b26d0a9560c Emit and handle (custom) `-register-changed` notification
Jan Vrany <jan.vrany@labware.com>
parents: 316
diff changeset
    64
    ^ (super description)
1b26d0a9560c Emit and handle (custom) `-register-changed` notification
Jan Vrany <jan.vrany@labware.com>
parents: 316
diff changeset
    65
        define:#frame as:Integer;
1b26d0a9560c Emit and handle (custom) `-register-changed` notification
Jan Vrany <jan.vrany@labware.com>
parents: 316
diff changeset
    66
        define:#regnum as:Integer;
1b26d0a9560c Emit and handle (custom) `-register-changed` notification
Jan Vrany <jan.vrany@labware.com>
parents: 316
diff changeset
    67
        yourself
1b26d0a9560c Emit and handle (custom) `-register-changed` notification
Jan Vrany <jan.vrany@labware.com>
parents: 316
diff changeset
    68
1b26d0a9560c Emit and handle (custom) `-register-changed` notification
Jan Vrany <jan.vrany@labware.com>
parents: 316
diff changeset
    69
    "Created: / 18-11-2021 / 23:04:07 / Jan Vrany <jan.vrany@labware.com>"
1b26d0a9560c Emit and handle (custom) `-register-changed` notification
Jan Vrany <jan.vrany@labware.com>
parents: 316
diff changeset
    70
    "Modified: / 18-09-2023 / 17:41:00 / Jan Vrany <jan.vrany@labware.com>"
249
272bd60a849c When setting register value via API, send `GDBRegisterValueChangedEvent`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
    71
! !
272bd60a849c When setting register value via API, send `GDBRegisterValueChangedEvent`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
    72
316
7cc3798b2ff7 Rename `GDBRegisterValueChangedEvent` to `GDBRegisterChangedEvent`
Jan Vrany <jan.vrany@labware.com>
parents: 272
diff changeset
    73
!GDBRegisterChangedEvent methodsFor:'initialization'!
249
272bd60a849c When setting register value via API, send `GDBRegisterValueChangedEvent`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
    74
322
1b26d0a9560c Emit and handle (custom) `-register-changed` notification
Jan Vrany <jan.vrany@labware.com>
parents: 316
diff changeset
    75
setFrame: aGDBFrameOrInteger
1b26d0a9560c Emit and handle (custom) `-register-changed` notification
Jan Vrany <jan.vrany@labware.com>
parents: 316
diff changeset
    76
    self assert: frame isNil.
1b26d0a9560c Emit and handle (custom) `-register-changed` notification
Jan Vrany <jan.vrany@labware.com>
parents: 316
diff changeset
    77
1b26d0a9560c Emit and handle (custom) `-register-changed` notification
Jan Vrany <jan.vrany@labware.com>
parents: 316
diff changeset
    78
    frame := aGDBFrameOrInteger
1b26d0a9560c Emit and handle (custom) `-register-changed` notification
Jan Vrany <jan.vrany@labware.com>
parents: 316
diff changeset
    79
1b26d0a9560c Emit and handle (custom) `-register-changed` notification
Jan Vrany <jan.vrany@labware.com>
parents: 316
diff changeset
    80
    "Created: / 06-12-2023 / 11:11:24 / Jan Vrany <jan.vrany@labware.com>"
1b26d0a9560c Emit and handle (custom) `-register-changed` notification
Jan Vrany <jan.vrany@labware.com>
parents: 316
diff changeset
    81
!
1b26d0a9560c Emit and handle (custom) `-register-changed` notification
Jan Vrany <jan.vrany@labware.com>
parents: 316
diff changeset
    82
1b26d0a9560c Emit and handle (custom) `-register-changed` notification
Jan Vrany <jan.vrany@labware.com>
parents: 316
diff changeset
    83
setRegnum: anInteger
1b26d0a9560c Emit and handle (custom) `-register-changed` notification
Jan Vrany <jan.vrany@labware.com>
parents: 316
diff changeset
    84
    self assert: regnum isNil.
1b26d0a9560c Emit and handle (custom) `-register-changed` notification
Jan Vrany <jan.vrany@labware.com>
parents: 316
diff changeset
    85
    self assert: anInteger isInteger.
1b26d0a9560c Emit and handle (custom) `-register-changed` notification
Jan Vrany <jan.vrany@labware.com>
parents: 316
diff changeset
    86
1b26d0a9560c Emit and handle (custom) `-register-changed` notification
Jan Vrany <jan.vrany@labware.com>
parents: 316
diff changeset
    87
    regnum := anInteger
1b26d0a9560c Emit and handle (custom) `-register-changed` notification
Jan Vrany <jan.vrany@labware.com>
parents: 316
diff changeset
    88
1b26d0a9560c Emit and handle (custom) `-register-changed` notification
Jan Vrany <jan.vrany@labware.com>
parents: 316
diff changeset
    89
    "Created: / 06-12-2023 / 11:12:35 / Jan Vrany <jan.vrany@labware.com>"
249
272bd60a849c When setting register value via API, send `GDBRegisterValueChangedEvent`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
    90
! !
272bd60a849c When setting register value via API, send `GDBRegisterValueChangedEvent`
Jan Vrany <jan.vrany@labware.com>
parents:
diff changeset
    91