Bug 30820 - DAP GDB: Getting an error when bypassing "source" to breakpoint
Summary: DAP GDB: Getting an error when bypassing "source" to breakpoint
Status: RESOLVED FIXED
Alias: None
Product: gdb
Classification: Unclassified
Component: dap (show other bugs)
Version: unknown
: P2 normal
Target Milestone: 14.1
Assignee: Tom Tromey
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2023-09-04 08:20 UTC by Artem Sokolovskii
Modified: 2023-09-12 16:37 UTC (History)
1 user (show)

See Also:
Host:
Target:
Build:
Last reconfirmed: 2023-09-04 00:00:00


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Artem Sokolovskii 2023-09-04 08:20:20 UTC
I updated my gdb sources and built it today. I found out that breakpoint structure was changed for gdb dap. Before it works correctly I could add "source" field to "Breakpoint" structure(as it is written in the dochttps://microsoft.github.io/debug-adapter-protocol/specification#Types_Breakpoint). But now I shouldn't do this otherwise I'm not able to set breakpoints with an error "gdb.dap.breakpoint._rewrite_src_breakpoint() got multiple values for keyword argument 'source".
Could you please do as it was before?

Log:
How it works now. wo "source" field.
qtc.dbg.dapengine: "Content-Length: 166\r\n\r\n{\"arguments\":{\"breakpoints\":[{\"line\":16}],\"source\":{\"path\":\"/home/artem/work/testproj/untitled/mainwindow.cpp\"}},\"command\":\"setBreakpoints\",\"seq\":15,\"type\":\"request\"}"

How it worked before. with "source" field according to documentation. 
qtc.dbg.dapengine: "Content-Length: 260\r\n\r\n{\"arguments\":{\"breakpoints\":[{\"line\":16,\"source\":{\"name\":\"mainwindow.cpp\",\"path\":\"/home/artem/work/testproj/untitled/mainwindow.cpp\"}}],\"source\":{\"path\":\"/home/artem/work/testproj/untitled/mainwindow.cpp\"}},\"command\":\"setBreakpoints\",\"seq\":15,\"type\":\"request\"}"
qtc.dbg.dapengine: insertBreakpoint 1 "1"
qtc.dbg.dapengine: "Content-Length: 207\r\n\r\n{\"request_seq\": 15, \"type\": \"response\", \"command\": \"setBreakpoints\", \"success\": false, \"message\": \"gdb.dap.breakpoint._rewrite_src_breakpoint() got multiple values for keyword argument 'source'\", \"seq\": 177}"
Comment 1 Tom Tromey 2023-09-04 17:53:20 UTC
set_breakpoint does:

        specs = [_rewrite_src_breakpoint(source=source, **bp) for bp in breakpoints]

but if 'bp' has a 'source' entry then this will cause the clash.

While we should probably fix this, at the same time I'm not sure this
is expected.  setBreakpoints takes an array of SourceBreakpoint objects,
not Breakpoint objects.  And SourceBreakpoint doesn't mention "source".
Comment 2 Artem Sokolovskii 2023-09-05 08:00:55 UTC
Yeah, You are right about SourceBreakpoint. Then it is not relevant.
Comment 4 Artem Sokolovskii 2023-09-05 13:55:52 UTC
Thanks:) Idk Should I close the bug or someone else should do this?
Comment 5 Sourceware Commits 2023-09-12 16:37:10 UTC
The master branch has been updated by Tom Tromey <tromey@sourceware.org>:

https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=f8ab027008863bd06513053ea9f84e1116c1cf73

commit f8ab027008863bd06513053ea9f84e1116c1cf73
Author: Tom Tromey <tromey@adacore.com>
Date:   Tue Sep 5 06:55:54 2023 -0600

    Avoid spurious breakpoint-setting failure in DAP
    
    A user pointed out that if a DAP setBreakpoints request has a 'source'
    field in a SourceBreakpoint object, then the gdb DAP implementation
    will throw an exception.
    
    While SourceBreakpoint does not allow 'source' in the spec, it seems
    better to me to accept it.  I don't think we should fully go down the
    "Postel's Law" path -- after all, we have the type-checker -- but at
    the same time, if we do send errors, they should be intentional and
    not artifacts of the implementation.
    
    Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=30820
Comment 6 Tom Tromey 2023-09-12 16:37:43 UTC
Fixed.