MingW64 не генерирует полную отладочную информацию для лямбды - PullRequest
1 голос
/ 21 февраля 2020

Я работаю над отладчиком, который поддерживает ряд форматов информации об отладке, включая DWARF. Недавно я столкнулся со странной вещью: mingw64 не выдает информацию о номерах строк для кода внутри лямбды.

Вот что я скомпилировал:

void CallLambda(void (*lambda)());

int main()
{
    for (int i = 0; i < 10000; i++)
        CallLambda([]()-> void        // <-- line #27
        {
            CallLambda([]()-> void
            {
                new int;
                new int;
            });
        });

    return 0;
}
...
void CallLambda(void (*lambda)())
{
    lambda(); // <-- line #138
}

Мой отладчик перехватывает вызовы operator new и сохраняет стек вызовов для каждого; только адреса. Более поздние записи разрешаются с использованием доступной отладочной информации.

Здесь стеки вызовов, которые я получил для этих operator new:

libstdc++-6.dll!Znwy + 0x17 bytes 000000006fd07287
main.exe!0000000000401571 (for another new int here the address main.exe!000000000040157b)
main.exe!0000000000401594
main.exe!_Z10CallLambdaPFvvE Line 138 + 0x10 bytes 00000000004019f8
main.exe!00000000004015cd
main.exe!00000000004015e6
main.exe!_Z10CallLambdaPFvvE Line 138 + 0x10 bytes 00000000004019f8
main.exe!main Line 25 + 0x2c bytes 000000000040162f
...

Я сбросил отладочную информацию DWARF, чтобы найти любую информацию для адресов 0x401571 и 0x40157b.

Нашли единственное место, которое соответствует обоим адресам:

< 4><0x00005b48>          DW_TAG_structure_type
                            DW_AT_name                  <lambda()>
                            DW_AT_decl_file             0x00000001 I:/Projects/deleaker/branches/branch_2020_02_10_leak_in_lambda/deleaker2/TestProjects/MingwTest/main.cpp
                            DW_AT_decl_line             0x0000001b
...
< 5><0x00005b6e>            DW_TAG_subprogram
...
                              DW_AT_low_pc                0x00401560
                              DW_AT_high_pc               <offset-from-lowpc>39

Здесь весь вывод.

Так что, похоже, информация недостаточно, чтобы найти номера строк для 0x401571 и 0x40157b: родительский узел DW_TAG_structure_type содержит DW_AT_decl_line = 0x0000001b = 27.

Мне кажется, я что-то упустил.

Здесь версия mingw64:

g++.EXE (i686-posix-dwarf-rev0, Built by MinGW-W64 project) 7.3.0
Copyright (C) 2017 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
...