gewusst wie: Debuggen "Ungültiger parameter übergeben C-Laufzeit-Funktion"?

Hintergrund

Ich habe noch ungefähr ein terabyte an Dateien mit raw-Daten, mit einer relativ kleinen Teilmenge der Daten gekennzeichnet. Ich habe geschrieben c++ - code (Aufruf einige alte MSVC++2003-code, den ich stark modifiziert, um es zu kompilieren, die auf den jüngsten Compiler) zum aggregieren der annotierten Daten-Scheiben.

Einen großen Teil der ausgezeichneten Daten konzentriert ist, in eine Datei, aber die Datei stellt sich heraus zu sein, und mein Programm stürzt ab.

Problem

Ich bin immer

Invalid parameter passed to C runtime function.
Invalid parameter passed to C runtime function.
terminate called after throwing an instance of 'int'

In meinem Qt-output-Fenster, und windows sagt mir das gleiche in einem popup-Fenster, aber an diesem Punkt ist es zu spät, um jede nützliche info aus der ausführbaren Datei /debugger scheint es, (obwohl ich bin nicht erfahren mit der Qt-debugger).

Was ich versucht habe

Habe ich gegoogelt alle über und fand eine Menge Menschen mit dieser Fehlermeldung, aber es ist so generisch, dass keines Ihrer Probleme sein könnte, die gleiche wie meine, und es gibt eine so lange Liste von verschiedene C runtime-Funktionen, sichten durch alle von Ihnen ist langsam und es scheint nicht zu helfen.

Meine Frage

"Einen Mann finden, ein Fehler, und Sie helfen, ihn für einen Tag. Teach einen Mann zu Debuggen und helfen Sie ihm ein Leben lang. Post der Weg, auf stackoverflow und Sie helfen, viele Männer und viel bekommen upvotes."

Gibt es eine generische Methode zu finden, welche C-Laufzeit-Funktion das problem war und was das argument war? Habe ich vermissen einige Phantasie-debugger-Funktionen? Gibt es etwas, was Sie empfehlen könnte, oder Infos die ich bieten könnte?

Ich hoffe, dass man eine allgemeingültige Antwort auf diese, jedem zu helfen, mit diesem problem, nicht nur für mich, aber ich werde froh sein, wenn ich bin, half natürlich auch.

Spezifisch zu meinem problem:

Meinen stack trace ist wie folgt:

0 ntdll!DbgBreakPoint 0x7727000d

1 ntdll!DbgUiRemoteBreakin 0x772ff156

2 ?? 0x6f06eaa1

3 KERNEL32!BaseThreadInitThunk 0x7501338a

4 ntdll!RtlInitializeExceptionChain 0x77299902

5 ntdll!RtlInitializeExceptionChain 0x772998d5

6 ??

und gdb kann nicht eine bessere Spur scheint es (alles, was ich versuche zu tun, es bekommt von mir ein timeout-Fehler).

Nach dem Versuch ein paar mehr Funktionen, nur um sicher zu sein, alles gab ein timeout zu versuchen "backtrace" wieder einmal hat mir ein Ergebnis. Ich habe halt nie so viel Zeit in der gdb nach timeouting auf mich einmal.

Sagte, ich könnte in der Lage sein, etwas zu finden, mit dieser neuen info. Als mein spezifisches problem zu schließen, aber meine Allgemeine Punkt ist noch gültig ich glaube: ich habe jetzt die Funktion mit dem problem (denke ich), aber nicht warum es ein problem ist, noch was die ungültigen parameter. Noch besser, ich habe verfolgt es eine Linie, wo es heißt "werfen 1". So, jetzt gehe ich davon aus windows/Qt übersetzt, dass der "ungültige parameter". Aber es ist nicht wahr.

Es kann einfach sein, dass einige schlechte code, es braucht auch nicht eine C-Funktion, und Sie müssen nichts falsch mit Ihrem Parameter.

...

#17 0x00c17d72 in libstdc++-6!.cxa_throw () aus C:\Qt\5.5\mingw492_32\bin\libstdc++-6.dll
Kein symbol table info zur Verfügung.
...

  • Der Punkt, wo das Windows-popup erscheint, ist eine hervorragende man-debugger an den Prozess - Sie sollten sehen, das volle stack-trace. Nicht schließen das popup-vor der Befestigung.
  • Ich habe sogar versucht, läuft es ganz von der Qt-debugger, aber Qt nicht haben (oder kennen) der Quelle für die Datei, und zeigt mir einige dekompiliert Müll. Ich habe auch nicht einen stack-trace. Ich werde führen Sie es erneut zu versuchen und erhalten einen screenshot, vielleicht bin ich auch nur blind.
  • In Antwort auf Ihre Entfernung von meiner C-tag Hinzugefügt habe ich es, da es technisch einen C++ zu C Kommunikations-Fehler (da der Fehler speziell Referenzen "C-Laufzeit-Funktion"). Sollte ich das nicht tun?
  • Du fragst nach einem C++ - Programm; die C-runtime enthalten ist, in C++ (mit verschiedenen änderungen). Du bist nicht zu Fragen C; Sie passieren einfach, es zu erwähnen.
  • fair enough, danke für die Klarstellung.
  • Ich hatte das gleiche problem. Meine Ausnahme war throwed in einem thread, und ich war versucht, es zu fangen in einem anderen thread. Fangen Sie die Ausnahme innerhalb der Funktion run und rethrow es in die wartenden thread mein Problem gelöst. Diese Antwort hat mir geholfen : stackoverflow.com/a/32428427/2826340

InformationsquelleAutor Joran Dox | 2016-05-01
Schreibe einen Kommentar