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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Persönlich, auf einem Linux-terminal, benutze ich gcc zum kompilieren und den gdb zum Debuggen. Kompilieren Sie ein Programm mit debugging-Optionen gcc verwenden, Sie einfach hinzufügen ein
-g
auf Ihre anderen Fahnen. Ex:gcc file.c -o file -std=c99 -g
. Sie können dann geben Siegdb file
und geben Sie in einen interaktiven debugger. Unter andere nützliche Dinge, können Sie das Programm ausführen, aufrufen von Funktionen und einfügen von Haltepunkten. Für eine vollständige und gut erklärt-Nutzung gehen Sie zu dieser websitehttp://www.tutorialspoint.com/gnu_debugger/index.htmIn Visual Studio 2017 mindestens, Sie können drücken Sie STRG+B, und fügen Sie eine Funktion Haltepunkt auf
_invalid_parameter
. Dies wird verhindern, dass dein Programm an der Stelle, wo die Nachricht protokolliert worden sind, die lassen Sie finden die problematische Funktion im call-stack. Es funktioniert sogar, wenn jemand anderes code macht Ihren Anruf zu_CrtSetReportMode()
.Da das Protokoll wird gedruckt, um die debug-Konsole dann sollte es gemeldet werden, die von
OutputDebugStringA
Funktion. Sie können einen breakpoint auf die Funktion zu sehen, die Ergebnisse in das Protokoll. Platzieren Sie einen breakpoint auf eine Funktion können SieCtrl+B
in Visual Studio, und geben Sie name der Funktion:Aber dies könnte nicht funktionieren, oder Sie haben zu viele andere Meldungen protokolliert mit
OutputDebugStringA
. In der RegelInvalid parameter passed to C runtime function
berichtet _invalid_parameter, so können Sie genauso gut versuchen, einen Haltepunkt auf_invalid_parameter
Funktion. Diese könnte nicht so gut funktionieren, weil es sein könnte, berichtete von einigen anderen system-dll, die Ihre Prozess-links zu:ntdll.dll
,KernelBase.dll
etc. Platzieren Sie einen breakpoint auf eine Funktion exportiert, die von einer dll, die Sie verwenden müssen:<dll>!<exportname>
:Alle diese verschiedenen Funktionen und Sie können Ihre Adressen:
In meinem Fall nur wenn ich einen Haltepunkt auf
ntdll.dll!__invalid_parameter
ich war in der Lage, um zu sehen, backtrace und die log-Meldung wurde verursacht, durchGetAdaptersAddresses
winapi. Der Grund Haltepunkt aufOutputDebugStringA
war nicht hilfreich war, weil das Protokoll gedruckt wurde, durchDbgPrint
api. Platzieren Haltepunkt aufDbgPrint
funktioniert in diesem Fall.Dinge, die ich gelernt, aus dieser Frage (und das könnte helfen, die Menschen auf der Suche für diese Frage) :
werfen 1;
Dies bedeutet, Es kann einfach sein, dass einige schlechte code, es braucht auch nicht eine C-Funktion, und Sie müssen nichts falsch mit Ihrem Parameter. Suchen Sie den code und Bibliotheken " Quelle für "werfen"
Ich lief in dieser gleichen Fehlermeldung "Ungültiger parameter..." beim Debuggen von einem windows-Treiber.
Die Technik auf dieser Seite, obwohl es für Windows und nicht genau-Adressierung für diese Frage, könnte nützlich sein, um jemanden, der sich für diese spezielle Fehlermeldung. IOW-HTH..
http://dennisyurichev.blogspot.com/2013/05/warning-invalid-parameter-passed-to-c.html
So, in Zusammenfassung, die Sie haben, um einzugrenzen, die für Ihre Umgebung spezifisch, wo ein debug-string ausgegeben wird, indem Sie möglicherweise einen debugging - "Helfer" - library-Funktion. Sobald bekannt, wird es einen Haltepunkt festlegen und dann schauen Sie wieder oben auf dem Aufruf-stack. IMHO, es ist eine sehr clevere Lösung, was kann eine schwierige Lage zu finden.