Отладка .dll с приложением приложения R выдает ошибку «Недопустимая инструкция» - PullRequest
1 голос
/ 18 февраля 2020

Программа, которую я отлаживаю, является приложением R GUI, которое использует несколько C .dll файлов для выполнения задач. Я использую Visual Studio 2019 в качестве отладчика.

Ошибка: Unhandled exception at 0x00000000279BB8CC (tcl86.dll) in rsession.exe: 0xC000001D: Illegal Instruction.

Я не уверен, как глубже понять, почему tcl86.dll работает так, как есть.

Я впервые отлаживаю программу, и она оказывается довольно запутанной, поэтому я не уверен, как интерпретировать вывод, который мне дают. Я поделюсь настолько, насколько смогу, и дам мне знать, если мне нужно будет опубликовать дополнительную информацию.

Вот стек вызовов:

    tcl86.dll!00000000279bb8cc()    Unknown Non-user code. Binary was not built with debug information.
    tcl86.dll!000000002797f8b5()    Unknown Non-user code. Binary was not built with debug information.
    tcl86.dll!000000002797f9d2()    Unknown Non-user code. Binary was not built with debug information.
    tcl86.dll!0000000027999606()    Unknown Non-user code. Binary was not built with debug information.
    tcl86.dll!0000000027999c2b()    Unknown Non-user code. Binary was not built with debug information.
>   tkogl2.dll!del(void * clientData, Tcl_Interp * interp, int objc, Tcl_Obj * const * objv) Line 1148  C   Symbols loaded.
    tcl86.dll!00000000278a7a07()    Unknown Non-user code. Binary was not built with debug information.
    tcltk.dll!000000006c302378()    Unknown Non-user code. Binary was not built with debug information.
    R.dll!000000006c7a6542()    Unknown Non-user code. Binary was not built with debug information.
    R.dll!000000006c7f3249()    Unknown Non-user code. Binary was not built with debug information.
    R.dll!000000006c801fe1()    Unknown Non-user code. Binary was not built with debug information.
    R.dll!000000006c80268c()    Unknown Non-user code. Binary was not built with debug information.
    R.dll!000000006c802f2a()    Unknown Non-user code. Binary was not built with debug information.
    R.dll!000000006c7f6733()    Unknown Non-user code. Binary was not built with debug information.
    R.dll!000000006c801fe1()    Unknown Non-user code. Binary was not built with debug information.
    R.dll!000000006c803a98()    Unknown Non-user code. Binary was not built with debug information.
    R.dll!000000006c804b1f()    Unknown Non-user code. Binary was not built with debug information.
    R.dll!000000006c7f8bdf()    Unknown Non-user code. Binary was not built with debug information.
    R.dll!000000006c801fe1()    Unknown Non-user code. Binary was not built with debug information.
    R.dll!000000006c803a98()    Unknown Non-user code. Binary was not built with debug information.
    R.dll!000000006c804b1f()    Unknown Non-user code. Binary was not built with debug information.
    R.dll!000000006c7f8bdf()    Unknown Non-user code. Binary was not built with debug information.
    R.dll!000000006c801fe1()    Unknown Non-user code. Binary was not built with debug information.
    R.dll!000000006c803a98()    Unknown Non-user code. Binary was not built with debug information.
    R.dll!000000006c804b1f()    Unknown Non-user code. Binary was not built with debug information.
    R.dll!000000006c7f8bdf()    Unknown Non-user code. Binary was not built with debug information.
    R.dll!000000006c801fe1()    Unknown Non-user code. Binary was not built with debug information.
    R.dll!000000006c803a98()    Unknown Non-user code. Binary was not built with debug information.
    R.dll!000000006c804b1f()    Unknown Non-user code. Binary was not built with debug information.
    R.dll!000000006c7f8bdf()    Unknown Non-user code. Binary was not built with debug information.
    R.dll!000000006c801fe1()    Unknown Non-user code. Binary was not built with debug information.
    R.dll!000000006c803a98()    Unknown Non-user code. Binary was not built with debug information.
    R.dll!000000006c804b1f()    Unknown Non-user code. Binary was not built with debug information.
    R.dll!000000006c7f8bdf()    Unknown Non-user code. Binary was not built with debug information.
    R.dll!000000006c801fe1()    Unknown Non-user code. Binary was not built with debug information.
    R.dll!000000006c803a98()    Unknown Non-user code. Binary was not built with debug information.
    R.dll!000000006c804b1f()    Unknown Non-user code. Binary was not built with debug information.
    R.dll!000000006c801fa2()    Unknown Non-user code. Binary was not built with debug information.
    R.dll!000000006c80268c()    Unknown Non-user code. Binary was not built with debug information.
    R.dll!000000006c802f2a()    Unknown Non-user code. Binary was not built with debug information.
    R.dll!000000006c7f6733()    Unknown Non-user code. Binary was not built with debug information.
    R.dll!000000006c801fe1()    Unknown Non-user code. Binary was not built with debug information.
    R.dll!000000006c80268c()    Unknown Non-user code. Binary was not built with debug information.
    R.dll!000000006c802f2a()    Unknown Non-user code. Binary was not built with debug information.
    R.dll!000000006c7f6733()    Unknown Non-user code. Binary was not built with debug information.
    R.dll!000000006c801fe1()    Unknown Non-user code. Binary was not built with debug information.
    R.dll!000000006c80268c()    Unknown Non-user code. Binary was not built with debug information.
    R.dll!000000006c802f2a()    Unknown Non-user code. Binary was not built with debug information.
    R.dll!000000006c7f6733()    Unknown Non-user code. Binary was not built with debug information.
    R.dll!000000006c801fe1()    Unknown Non-user code. Binary was not built with debug information.
    R.dll!000000006c80268c()    Unknown Non-user code. Binary was not built with debug information.
    R.dll!000000006c802f2a()    Unknown Non-user code. Binary was not built with debug information.
    R.dll!000000006c7f6733()    Unknown Non-user code. Binary was not built with debug information.
    R.dll!000000006c801fe1()    Unknown Non-user code. Binary was not built with debug information.
    R.dll!000000006c80268c()    Unknown Non-user code. Binary was not built with debug information.
    R.dll!000000006c802f2a()    Unknown Non-user code. Binary was not built with debug information.
    R.dll!000000006c7f6733()    Unknown Non-user code. Binary was not built with debug information.
    R.dll!000000006c801fe1()    Unknown Non-user code. Binary was not built with debug information.
    R.dll!000000006c803a98()    Unknown Non-user code. Binary was not built with debug information.
    R.dll!000000006c804b1f()    Unknown Non-user code. Binary was not built with debug information.
    R.dll!000000006c7f8bdf()    Unknown Non-user code. Binary was not built with debug information.
    R.dll!000000006c801fe1()    Unknown Non-user code. Binary was not built with debug information.
    R.dll!000000006c803a98()    Unknown Non-user code. Binary was not built with debug information.
    R.dll!000000006c804b1f()    Unknown Non-user code. Binary was not built with debug information.
    R.dll!000000006c7f8bdf()    Unknown Non-user code. Binary was not built with debug information.
    R.dll!000000006c801fe1()    Unknown Non-user code. Binary was not built with debug information.
    R.dll!000000006c803a98()    Unknown Non-user code. Binary was not built with debug information.
    R.dll!000000006c804b1f()    Unknown Non-user code. Binary was not built with debug information.
    R.dll!000000006c7f8bdf()    Unknown Non-user code. Binary was not built with debug information.
    R.dll!000000006c801fe1()    Unknown Non-user code. Binary was not built with debug information.
    R.dll!000000006c803a98()    Unknown Non-user code. Binary was not built with debug information.
    R.dll!000000006c804b1f()    Unknown Non-user code. Binary was not built with debug information.
    R.dll!000000006c7f8bdf()    Unknown Non-user code. Binary was not built with debug information.
    R.dll!000000006c801fe1()    Unknown Non-user code. Binary was not built with debug information.
    R.dll!000000006c803a98()    Unknown Non-user code. Binary was not built with debug information.
    R.dll!000000006c804b1f()    Unknown Non-user code. Binary was not built with debug information.
    R.dll!000000006c801fa2()    Unknown Non-user code. Binary was not built with debug information.
    tcltk.dll!000000006c301aae()    Unknown Non-user code. Binary was not built with debug information.
    tcl86.dll!00000000278a2492()    Unknown Non-user code. Binary was not built with debug information.
    tcl86.dll!00000000278a7a07()    Unknown Non-user code. Binary was not built with debug information.
    tcl86.dll!00000000278aa454()    Unknown Non-user code. Binary was not built with debug information.
    tk86.dll!0000000062982874() Unknown Non-user code. Binary was not built with debug information.
    tk86.dll!00000000629170bf() Unknown Non-user code. Binary was not built with debug information.
    tk86.dll!000000006292111f() Unknown Non-user code. Binary was not built with debug information.
    user32.dll!00007ffea7315b6d()   Unknown Non-user code. Cannot find or open the PDB file.
    user32.dll!00007ffea7315562()   Unknown Non-user code. Cannot find or open the PDB file.
    Rgraphapp.dll!000000006355751b()    Unknown Non-user code. Binary was not built with debug information.
    R.dll!000000006c721365()    Unknown Non-user code. Binary was not built with debug information.
    rsession.exe!000000000085b0e9() Unknown Non-user code. Binary was not built with debug information.
    R.dll!000000006c796727()    Unknown Non-user code. Binary was not built with debug information.
    rsession.exe!000000000085d670() Unknown Non-user code. Binary was not built with debug information.
    rsession.exe!000000000044de43() Unknown Non-user code. Binary was not built with debug information.
    rsession.exe!00000000004194b7() Unknown Non-user code. Binary was not built with debug information.
    rsession.exe!0000000000894845() Unknown Non-user code. Binary was not built with debug information.
    R.dll!000000006c829772()    Unknown Non-user code. Binary was not built with debug information.
    R.dll!000000006c829a01()    Unknown Non-user code. Binary was not built with debug information.
    R.dll!000000006c829a92()    Unknown Non-user code. Binary was not built with debug information.
    rsession.exe!00000000008a9801() Unknown Non-user code. Binary was not built with debug information.
    rsession.exe!00000000008915cf() Unknown Non-user code. Binary was not built with debug information.
    rsession.exe!0000000000bedf98() Unknown Non-user code. Binary was not built with debug information.
    rsession.exe!00000000004013e8() Unknown Non-user code. Binary was not built with debug information.
    rsession.exe!000000000040151b() Unknown Non-user code. Binary was not built with debug information.
    kernel32.dll!00007ffea5b47bd4() Unknown Non-user code. Cannot find or open the PDB file.
    ntdll.dll!00007ffea754ced1()    Unknown Non-user code. Cannot find or open the PDB file.

Вот вывод в отладчике: alloc: invalid block: 000000002BF31390: 0 2bException thrown at 0x00000000279BB8CC (tcl86.dll) in rsession.exe: 0xC000001D: Illegal Instruction. Unhandled exception at 0x00000000279BB8CC (tcl86.dll) in rsession.exe: 0xC000001D: Illegal Instruction.

Вот фрагмент кода, в котором отладчик остановился в коде C:

else if (strcmp(shape, "specimens") == 0)
    {
        specimen_del(0);

        if (models != NULL)
        {
            Tcl_Free((char*)models);
            models = NULL; //error symbol here
        }
        if (context != NULL)
        {
            Tcl_Free((char*)context);
            context = NULL;
        }
    }

Цель этого поста - понять, как интерпретировать ошибку и информацию Мне дают отладчик и потенциальные решения, которые я могу исследовать. Спасибо!

1 Ответ

1 голос
/ 18 февраля 2020

Первая часть этого сообщения, alloc: invalid block: 000000002BF31390: 0 2b, является сообщением из библиотеки Tcl. Смысл сообщения заключается в том, что память была повреждена из-за записи памяти за пределы допустимого диапазона. Место генерации этого сообщения находится в распределителе памяти Tcl с поддержкой потоков, но , а не - это место, где ошибка : , именно там была обнаружена проблема . Как только память повреждена, все ставки на будущее поведение программы отключены; умирание с ошибочной инструкцией полностью возможно (что может быть связано с поврежденным стеком).

Ни библиотеки Tcl, ни библиотеки Tk (в частности, tcl86.dll и tk86.dll в вашей трассировке стека) не создадут границ доступа, если память не повреждена: мы действительно очень тщательно проверяем подобные вещи (и имеем режимы сборки разработчика, которые выявляют любые подобные проблемы, по крайней мере, при их реализации). Однако, если другой код пишет, где он не должен (и там есть много кода, за который я не могу ручаться вообще), тогда все ставки выключены , потому что предварительные условия для правильности кода больше не выполняются .

tl; dr У вас проблема с повреждением памяти. Что много отстой.

Попробуйте сборку приложения c с помощью инструмента отслеживания доступа к памяти, такого как электрический забор или очистка (могут быть и другие, этот список не является исчерпывающим); снижение производительности для этого очень велико, но шансы найти саму ошибку достаточно высоки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...