Фон
У меня есть терабайт файлов с необработанными данными с относительно небольшим подмножеством помеченных данных. Я написал код С++ (вызывающий некоторый древний код MSVС++ 2003, который я сильно модифицировал, чтобы его компилировать на последних компиляторах) для объединения аннотированных срезов данных.
Большая часть этих помеченных данных сосредоточена в одном файле, но этот файл оказывается тем, где моя программа вылетает.
Проблема
Я получаю
Invalid parameter passed to C runtime function.
Invalid parameter passed to C runtime function.
terminate called after throwing an instance of 'int'
В моем окне вывода Qt, и окна говорят мне то же самое во всплывающем окне, но на данный момент слишком поздно, чтобы получить какую-либо полезную информацию из исполняемого/отладчика, кажется (хотя я вообще не испытываю с Qt отладчик).
Что я пробовал
Я искал всю информацию и нашел много людей с этим сообщением об ошибке, но он настолько общий, что ни одна из их проблем не может быть такой же, как моя, и существует такой длинный список различных функций времени выполнения C, которые просеивают все они медленны и, похоже, не помогают.
Мой вопрос
"Найди мужчину ошибку, и ты поможешь ему на один день. Научите человека отлаживать, и вы помогаете ему всю жизнь. Отправьте путь на stackoverflow, и вы поможете многим мужчинам и получите много очков".
Существует ли общий метод, чтобы найти функцию C runtime, и что аргумент был? Я пропустил некоторые причудливые функции отладчика? Есть ли что-нибудь еще, что вы могли бы рекомендовать или информацию, которую я мог бы предоставить?
Надеюсь получить ответ на этот вопрос, чтобы помочь всем с этой проблемой, а не только мне, но я буду рад, если мне тоже помогут.
Конкретно для моей проблемы:
Моя трассировка стека выглядит следующим образом:
0 ntdll! DbgBreakPoint 0x7727000d
1 ntdll! DbgUiRemoteBreakin 0x772ff156
2?? 0x6f06eaa1
3 KERNEL32! BaseThreadInitThunk 0x7501338a
4 ntdll! RtlInitializeExceptionChain 0x77299902
5 ntdll! RtlInitializeExceptionChain 0x772998d5
6??
и gdb не может получить лучшую трассировку (кажется, что я пытаюсь сделать с ней, я получаю ошибку тайм-аута).
Попробовав еще пару функций, чтобы быть уверенным, что все дало таймаут, чтобы попытаться "backtrace" еще раз дать мне результат. Наверное, я просто никогда не ставил это много времени в gdb после того, как он однажды набросился на меня.
Тем не менее, я мог бы найти что-то с этой новой информацией. Подумайте, что моя проблема закрыта, но мой общий момент все еще верен. Я верю: теперь я нашел функцию с проблемой (я думаю), но не почему это проблема, и что это недопустимый параметр. Еще лучше, я проследил его до строки, где говорится "throw 1". Поэтому теперь я предполагаю, что windows/Qt переводит это в "недопустимый параметр". Но это неправда.
Это может быть просто неправильный код, ему даже не нужно быть функцией C, и ничто не должно быть неправильным с вашими параметрами.
...
# 17 0x00c17d72 в libstdС++ - 6!.cxa_throw() из C:\Qt\5.5\mingw492_32\bin\libstdС++ - 6.dll Информация о таблице символов недоступна. ...