Comments (14)
Are you able to set breakpoints?
You can use https://github.com/Microsoft/microsoft-pdb/tree/master/cvdump to dump the resulting PDB file and verify whether it contains sensible line numbers.
from cv2pdb.
Thanks, it works if put breakpoint in source file
but sometimes after F10 it returns "Source not available" - is it expected behaviour?
and some variables not indicate - how i can improv level of debugging? maybe need some additional flags?
(it looks like release with debug info)
from cv2pdb.
64-bit mingw is used here. And by "indicate variables" watches/locals/autos in Visual Studio debugger are meant I assume. They are not available in most cases, although it's written in the Features section:
- display of variables, fields and objects in watch, local and auto window and in data tooltips
So it should be supported. May there be a problem in lack of dwarf debug info in the source dll/exe? Which are the recommended mingw options in that case?
The source language for the library we're trying to debug is C, not C++. And we link that to a VS C++ program. Will posting cvdump output be any helpful?
It's already very nice that we're able to set breakpoints and see call stack I think, but full-featured debugging is what we seek for. Thank you!
from cv2pdb.
I suspect it very much depends on the debug info emitted by gcc. If you can provide an example executable/DLL that you want to convert and specify which functions' locals don't work I can have a look.
There has been a recent improvement to locals in #24 which has not yet made it into the downloadable executable. I just triggered a new build, should be available in a couple of minutes.
from cv2pdb.
I try to use new downloadable executable - it crashed on the files with that previous downloadable executable works well
use cflags -gdwarf -O0
from cv2pdb.
I just tried gcc (x86_64-posix-seh-rev0, Built by MinGW-W64 project) 7.3.0 and it worked ok for me.
What toolchain do you use? Could you provide an example executable?
from cv2pdb.
while @krylovgeorgii is working on getting executables, may I ask, which dwarf version should we use for the dwarf debug info? gcc defaults to version 4, but version 5 (experimental) also could be used. Found here
from cv2pdb.
Example of .dll with that that last downloadable executable crashed but previous works
https://drive.google.com/file/d/1m-Pm4Ah8_43hNoxEV0sTzklHzcnueIfq/view?usp=sharing
from cv2pdb.
@rainers we use gcc (Rev1, Built by MSYS2 project) 7.3.0
And we have complete scripts to build the mpv dll (it's a video playback library) here
I don't know if it's interesting for you, but just cloning the repository and running build_debug.bat
script should be enough to build all the files (it takes about an hour). mpv-1.dll
will be put to the build\mpv-git\build
folder in the end.
If you don't want to bother with it, maybe you want us to prepare an archive with sources included, so you could try some debugging on your machine?
from cv2pdb.
I've fixed the regression in the last version and another older issue. Should be already available as download.
cv2pdb has very little support for DWARF3 and 4, but your dump uses DW_FORM_sec_offset which is DWARF4 (the DLL name suggests otherwise, though). I added a bit of support for that but I guess it won't help too much because a lot of functions seem to be built with frame-pointer-omission. cv2pdb needs a frame pointer for local variables.
So I'd suggest trying to build with -gdwarf2 -fno-omit-frame-pointer
.
from cv2pdb.
I build with flags " -O0 -gdwarf-2 -fno-omit-frame-pointer " but locals variables dont works
builded dll https://drive.google.com/open?id=1m-Pm4Ah8_43hNoxEV0sTzklHzcnueIfq
from cv2pdb.
Hmmm, this DLL still doesn't use the frame pointer very often to address local variables. For example the output of objdump -W
for function mp_aframe_pool_allocate
shows:
<1><7c37>: Abbrev Number: 28 (DW_TAG_subprogram)
<7c38> DW_AT_external : 1
<7c39> DW_AT_name : mp_aframe_pool_allocate
<7c51> DW_AT_decl_file : 1
<7c52> DW_AT_decl_line : 540
<7c54> DW_AT_prototyped : 1
<7c55> DW_AT_type : <0x66a6>
<7c59> DW_AT_low_pc : 0x1400023d0
<7c61> DW_AT_high_pc : 0x140002547
<7c69> DW_AT_frame_base : 0x871 (location list)
<7c6d> DW_AT_GNU_all_call_sites: 1
<7c6e> DW_AT_sibling : <0x7ea5>
<2><7c72>: Abbrev Number: 29 (DW_TAG_formal_parameter)
<7c73> DW_AT_name : pool
<7c78> DW_AT_decl_file : 1
<7c79> DW_AT_decl_line : 540
<7c7b> DW_AT_type : <0x7ea5>
<7c7f> DW_AT_location : 0x988 (location list)
<2><7c83>: Abbrev Number: 30 (DW_TAG_formal_parameter)
<7c84> DW_AT_name : (indirect string, offset: 0x2d0): frame
<7c88> DW_AT_decl_file : 1
<7c89> DW_AT_decl_line : 540
<7c8b> DW_AT_type : <0x7eab>
<7c8f> DW_AT_location : 0x9e7 (location list)
<2><7c93>: Abbrev Number: 30 (DW_TAG_formal_parameter)
<7c94> DW_AT_name : (indirect string, offset: 0x217): samples
<7c98> DW_AT_decl_file : 1
<7c99> DW_AT_decl_line : 541
<7c9b> DW_AT_type : <0x66a6>
<7c9f> DW_AT_location : 0xa46 (location list)
...
and the respective location lists that describe where to find the variables:
00000988 00000001400023d0 00000001400023f4 (DW_OP_reg2 (rcx))
0000099b 00000001400023f4 000000014000244b (DW_OP_reg12 (r12))
000009ae 000000014000244b 0000000140002453 (DW_OP_GNU_entry_value: (DW_OP_reg2 (rcx)); DW_OP_stack_value)
000009c4 0000000140002453 0000000140002547 (DW_OP_reg12 (r12))
000009d7 <End of list>
000009e7 00000001400023d0 00000001400023fe (DW_OP_reg1 (rdx))
000009fa 00000001400023fe 0000000140002451 (DW_OP_reg15 (r15))
00000a0d 0000000140002451 0000000140002453 (DW_OP_GNU_entry_value: (DW_OP_reg1 (rdx)); DW_OP_stack_value)
00000a23 0000000140002453 0000000140002547 (DW_OP_reg15 (r15))
00000a36 <End of list>
00000a46 00000001400023d0 00000001400023fe (DW_OP_reg8 (r8))
00000a59 00000001400023fe 0000000140002449 (DW_OP_reg5 (rdi))
00000a6c 0000000140002449 0000000140002453 (DW_OP_GNU_entry_value: (DW_OP_reg8 (r8)); DW_OP_stack_value)
00000a82 0000000140002453 0000000140002547 (DW_OP_reg5 (rdi))
without any reference to the usual frame pointer rbp
. It also uses some GNU extension which is said to be DWARF5. Maybe -gstrict-dwarf
can help with the latter.
from cv2pdb.
Seems like -gstrict-dwarf
doesn't change anything. Just in case: how do we check for this DWARF5 info presence?
It's weird that rbp
isn't used. Maybe our compilation flags are messed up (I think gcc uses latest -O flag occurrence provided, which could also be overrided in the makefile). Looking into that currently.
To be sure that our toolchain is "sane", I think it makes sense to compile a smaller library and see if it works. Do you have by change any sample library/executable that you use for tests of new cv2pdb versions? Otherwise I will pick up a random one.
Btw we could make some documentation on cv2pdb troubleshooting in the end, so other people would know what to look for (cvdump/objdump/etc).
Much thanks!
from cv2pdb.
Any random small program should be fine. I have used this simple program for some regression tests in the past:
// test for cv2pdb
int x = 4;
int y = 5;
int z = 6;
struct S
{
int f;
int g;
int h;
static S create()
{
S s = { 2, 4, 9 };
return s;
}
void square()
{
f *= f;
g *= g;
h *= h;
}
};
class C : public S
{
public:
int i;
int j;
static long long ll;
C() : S(S::create())
{
square();
}
static int mul2(int z)
{
return 2*z;
}
virtual void foo(int z)
{
ll = mul2(z);
}
};
long long C::ll = 5;
class D : public C
{
public:
int k;
virtual void foo(int z)
{
C::foo(z);
}
};
int noargs()
{
int a = 1;
int b = 2;
int c = 3;
return a + b + c;
}
int main(int argc, char** argv)
{
int arr[8] = { 1, 2, 3, 4, 5, 6, 7, 8 };
S s = { 1, 3, 5 };
D* d = new D;
*(S*)d = s;
d->i = 8;
d->j = 9;
d->k = 10;
d->foo(7);
noargs();
int a = 1;
int b = 2;
int c = 3;
int *m = 0;
*m = argc;
return c;
}
Just in case: how do we check for this DWARF5 info presence?
I run objdup -W mpv.dll >dwarf
and then search for a function name in that dump, e.g. mp_aframe_pool_allocate
as in the example above. A bit below you find info for parameters (DW_TAG_formal_parameter) and variables (DW_TAG_variable) with a description of their location (DW_AT_location). If it is a location list, the value is an offset within the .debug_loc
section that you can also find in the dump.
from cv2pdb.
Related Issues (20)
- Lack of debug symbols in binary built with optimizations enabled HOT 2
- Appveyor cv2pdb.exe artifact deleted HOT 4
- Hang when vswhere produces no output HOT 1
- Any plans for new release? HOT 1
- What files from VisualStudio are strictly required for cv2pdb to run? HOT 2
- produces empty pdb for wined3d HOT 4
- Invalid form=11 for directory index lineHdrOffs=7ded41 HOT 4
- Lack of structures and classes forward declarations HOT 1
- Аnonymous unions and typedefs has the same UDT name "__noname"
- Unicode WCHAR strings in builds without native wchar_t not showing as strings in debugger
- cannot load PDB helper DLL HOT 2
- add continuation record(addDWARFFields)
- Cannot get class info after convert
- cv2pdb converted a PDB that neither IDA nor WinDbg recognize HOT 5
- missing symbols from generated pdb on windows 11 for FFmpeg shared libraries HOT 3
- How do i use this on executable built using by mingw64-qmake? HOT 4
- Cannot load PDB helper DLL HOT 1
- Ghidra support
- NASM bug HOT 1
- Missing symbols HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from cv2pdb.