| |
| Posted by Rainer Schuetze in reply to timotheecour | PermalinkReply |
|
Rainer Schuetze
Posted in reply to timotheecour
|
On 10/20/2012 12:53 AM, timotheecour wrote:
> short version:
> how to call a (non extern-C) function from visualD's debugger? ( I can
> do it with extern C)
> how to call a function with arguments that are stack variables (I can do
> it with actual numeric values, eg actual pointer addresses)
>
> long version:
>
> when debugging a session inside visual D, it can be very useful to call
> functions directly, eg:
>
> * to print variables that visual D doesn't display properly (such as
> dynamic arrays, where visualD just prints the length and pointer)
>
> * for interactive purposes (eg trying a function with different parameters)
>
> Currently, visualD's support for this is limited, but I was able to do
> certain useful things (I'm not sure if many people realized one can do
> this in visuald, but this can be useful):
I know it's possible and I use it in C++ from time to time, but never tried it in D.
>
> suppose we compile a D program into Main.exe:
> we can call extern(C) functions as follows, by adding a watch variable
> in visual studio debugger and entering in the name field:
> Main.exe!main_test@test1(2)
> => will show value=25, type=int, and will print in the command prompt
> "res=25"
>
> now get address of z1 by looking into "Locals":
> it shows:
> - z1 {length=4 ptr=0x01f20f40 {1} } int[]
> then display the dynamic array z1:
> Main.exe!main_test@writelnPtr(3,0x01f20f40)
>
> This is nice but not very convenient. Is there a way (if not, can that
> be addressed in the near future) to support the following?
VS2012 allows "main_test@writelnPtr(z1.length,z1.ptr)"
Actually, the changes to autoexp.dat that are done by the installer are supposed to display dynamic and associative arrays, but it seems they are broken in VS2012 and maybe also 2010.
>
> * Main.exe!main_test@writeln2(z1)
> =>currently returns: identifier "z1" is undefined
VS2012 says: "Passing class, struct or union types by value to a function evaluation is not supported". It works if you pass the argument by reference.
>
> * Main.exe!main_test@writeln2([1,2,3])
> =>currently returns: expected a type specifier
The VS debugger expects C/C++ syntax, so it cannot do this.
>
> * Main.exe!main_test@writeln3()
> =>currently returns: identifier "main_test@writeln3" is undefined
If you disable name demangling by cv2pdb, the symbol _D9main_test8writeln3FZv resolves to the function writeln3, but unfortunately its type is reported as "void*". I guess the VS debugger does not allow the calling convention used by D in function evaluation.
If you use mago as the debug engine, you will get better D expression support and output, but it is not capable of running functions through watch expressions. Unfortunately development of mago seems to have stopped/paused. Nevertheless, I think a dedicated debug engine is the way to go for the best user experience.
|