On 27/05/2026 14:27, Tomas Hajny via fpc-devel wrote:
On 2026-05-27 13:45, Martin Frb via fpc-devel wrote:

procedure DoFoo(s: AnsiString);
begin
   ...
  // paused here
   ...
   if s = ... then
   ...
end;
....
Then that user most likely does not want the variable in the caller to be changed?

Actually, I'd expect that _if_ the user wants to modify the value within the debugger, he wants to have full picture of effects of the modified value rather than just parcial effect which would never match real case scenario when the variable has a different value. Moreover, creating a copy for the modified version wouldn't change the reference used in the code of DoFoo, would it? Otherwise you'd need to modify not only the value, but also all parts of code in DoFoo retrieving this value to point to the new copy instead, right?


Yes, the idea would be that telling the debugger do "set s[1] to be '?'" would
- check the refcount
- if 1 => then modify directly
- if 2 or greater => then
  - create a new string in the target memory
  - change the char
  - point "s" to that new string
  - decref the old string
  // all this could alternatively be a call to "uniquestring" followed by the modification

And that would also deal with a refcount of -1 (a VARIABLE, but pointing to a constant string) => which should probably ask by default.


If that is done, then the code in "DoFoo" would continue, and "s" would have the new value.
But the caller would still the unmodified value.

---------------------
Also I completely forgot (and currently IIRC the debugger rejects it entirely)

Tell the debugger to modify: MyAnsiStr := 'abc'
Then the old value needs a decref, and a new string must be created.

But if it isn't refcounted, then the old value must not be touched, just the new one needs to be allocated in mem, and pointed to)
// and well that may leak, if the user doesn't know what they do...

---------------------
Generally we have 2 kind of users (more, but lets simplify)

1) the beginner-like user
Someone who might not even know that FPC uses copy on write.
Someone who truly thinks that after "s1 := s2;" they have 2 completely unrelated values.

2) the experienced user
Someone who knows what happens under the hood, and may make use of that within their code. And of course during debugging.


----------------
Currently, in the few cases where FpDebug can detect an AnsiString as such (Dwarf-3), it can handle it in function calls (definitely as result, iirc as param too, including from constant in the user expression). And FpDebug does do the correct additional calls to the rec cnt functions. (via the linker symbols, that usually are available)

Adding the tag will ensure FpDebug can more accurately/safely detect such strings.

OK, that indeed makes sense.

Well, and hence, back to my original question...

Any ideas what I should consider when formulating a feature request for additions to the DWARF standard.

And for that, the idea is to make sure that
 === The information can be added to debug info should that be needed ===

Once it can be added, we can still decide
- what we add
- how we use it

I want to avoid requesting it now, and then find that I forgot some.
E.g. I forgot that you can have properties like
  TFoo = class
     FList = array [0..9] of TPoint;
    property X2: integer read Flist[2].x;  // yes, that works
  end;
That doesn't even need function calls..
=> well that can be encoded as workaround "tag_member x2" / but then looses the info its a property

the DW_TAG_property support the field ".x", but not the index on the field var. (it supports other indices)

-------------------------------

So how are ref counts used with e.g. smart pointers.
What data types will there by in smart pointers
What operations happen on smart pointers and there data


_______________________________________________
fpc-devel maillist  -  [email protected]
https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-devel

Reply via email to