rainers / mago

Visual Studio plug-in for debugging D programs
http://dsource.org/projects/mago_debugger
Apache License 2.0
43 stars 10 forks source link

Mago-mi: Wrong stack list frames (-stack-list-frames) #21

Open andre2007 opened 6 years ago

andre2007 commented 6 years ago

For this source code, a break point is set on line 12 (writeln(args);).

import std.stdio;

void test1(string s)
{

}

void main(string[] args)
{
    writeln(args);
    string[] test = ["aaa", "bbb"];
    test1(test[0]);
}

Command -stack-list-frames returns following content

stack=[
frame={level="0",addr="0x00402256",func="D main+0x6",args=[],file="C:\\D\\projects\\rasptest1\\source\\app.d",fullname="C:\\D\\projects\\rasptest1\\source\\app.d",line="12"},
frame={level="1",addr="0x0040e34f",func="__D2rt6dmain211_d_run_mainUiPPaPUAAaZiZ6runAllMFZ9__lambda1MFZv+0x1b",args=[]},
frame={level="2",addr="0x0040e2d1",func="__D2rt6dmain211_d_run_mainUiPPaPUAAaZiZ6runAllMFZv+0x89",args=[]},
frame={level="3",addr="0x0040e16c",func="__d_run_main+0x1f8",args=[]},
frame={level="4",addr="0x0040df64",func="__entrypoint.main+0x14",args=[],file="C:\\D\\projects\\rasptest1\\source\\app.d",fullname="C:\\D\\projects\\rasptest1\\source\\app.d",line="7"},
frame={level="5",addr="0x00430401",func="_mainCRTStartup+0xa9",args=[]},
frame={level="6",addr="0x75828484",from="C:\\Windows\\SysWOW64\\kernel32.dll"},
frame={level="7",addr="0x76ef2fea",from="C:\\Windows\\SysWOW64\\ntdll.dll"},
frame={level="8",addr="0x76ef2fba",from="C:\\Windows\\SysWOW64\\ntdll.dll"}]

app.d main file is listed 2 times, level 0 and level 4.

Visual Stdio Mago Debugger for a comparable project

WindowsApp1.exe!D main() Line 12
WindowsApp1.exe!__D2rt6dmain211_d_run_mainUiPPaPUAAaZiZ6runAllMFZ9__lambda1MFZv() + 0x1b bytes
WindowsApp1.exe!__D2rt6dmain211_d_run_mainUiPPaPUAAaZiZ6runAllMFZv() + 0x89 bytes
WindowsApp1.exe!__d_run_main() + 0x1f8 bytes
WindowsApp1.exe!__entrypoint.main() Line 7 + 0x11 bytes
WindowsApp1.exe!_mainCRTStartup() + 0xa9 bytes
kernel32.dll!75828484   
ntdll.dll!76ef2fea  
ntdll.dll!76ef2fba  

The same application debugged under GDB (linux) returns following result:

stack=[
frame={level="0",addr="0x0000000000440828",func="D main",file="source/app.d",fullname="/mnt/c/D/projects/rasptest1/source/app.d",line="12"},
frame={level="1",addr="0x0000000000453a94",func="rt.dmain2._d_run_main()"},
frame={level="2",addr="0x0000000000453924",func="rt.dmain2._d_run_main()"},
frame={level="3",addr="0x0000000000453a03",func="rt.dmain2._d_run_main()"},
frame={level="4",addr="0x0000000000453924",func="rt.dmain2._d_run_main()"},
frame={level="5",addr="0x000000000045388f",func="_d_run_main"},
frame={level="6",addr="0x0000000000450d2e",func="main"}]
rainers commented 6 years ago

__entrypoint.main is the C main function generated by the D compiler alongside D's main. It should probably not have any file location information, but that is to be solved in the compiler.