_CrtSetBreakAlloc schlägt nicht an



  • Hallo zusammen,
    Ich habe einen reproduzierbaren heap error, der mir von Visual Studio 2017 nach Ende meines Programms angezeigt wird:
    {5979} normal block at 0x02D553D8, 772 bytes long.
    Data: < > 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

    Bisher hat mir _CrtSetBreakAlloc immer zuverlässig die Quelle angezeigt, jetzt aber leider nicht mehr. Ich habe 7 dlls und eine exe, in allen habe ich an dem von mir geratenen frühstmöglichen Punkt das _CrtSetBreakAlloc eingefügt.
    Was könnte das Problem sein?
    Soweit ich weiß wird wohl das Problem irgendwie VOR dem Setzen von _CrtSetBreakAlloc auftreten? Wie kann ich zuverlässig herausfinden, welches der frühstmögliche Punkt ist, an dem ich _CrtSetBreakAlloc einfügen kann?
    _CrtSetBreakAlloc an sich funktioniert, habe ich erfolgreich getestet.
    Weiterhin versucht have ich folgendes:

    int YourAllocHook(int nAllocType, void *pvData,
    	size_t nSize, int nBlockUse, long lRequest,
    	const unsigned char * szFileName, int nLine) {
    
    	if (nAllocType == _HOOK_ALLOC && nSize == 772)
    		int breakHere = 0;
    
    	if (nBlockUse == _CRT_BLOCK)
    		return(TRUE);
    	return true;
    }
    

    mit dem dazugehörigen _CrtSetAllocHook(YourAllocHook), weil der heap error 772 bytes hat. Das hat zu keinem Erfolg geführt, ich vermute mal dass ja auch _CrtSetAllocHook frühstmöglich gesetzt werden muss, wäre also vielleicht dasselbe Problem?
    Ich komme nicht mehr weiter, hoffe einer von euch was was...
    Danke!



  • Die Frage hat nichts mit C++ zu tun.

    When _DEBUG is not defined, calls to _CrtSetBreakAlloc are removed during preprocessing.

    https://msdn.microsoft.com/en-us/library/4wth1ha5.aspx



  • @mael15 sagte in _CrtSetBreakAlloc schlägt nicht an:

    _CrtSetBreakAlloc

    1. _CrtSetBreakAlloc gibt den bisherigen Wert zurück. Du kannst also folgenden Code ausführen um zu wissen wo der Count steht.
    auto prev = _CrtSetBreakAlloc(0);
    _CrtSetBreakAlloc(prev);
    
    1. Hast Du eventuell einige DLLs statiisch gegen eine CRT gekinkt. In diesem Fall hat dieses Modul einen eigenen _CrtSetBreakAlloc!

    2. Wenn Du denkst, dass der Fehler früh auftritt, dann erzeuge in dem Modul von WinMain/main eine globale Variable mit

    static auto _CrtSetBreakAlloc (5979);
    

    gut möglich, dass in einem Deiner globalen statischen Variablen ein Leak entsteht.

    Hinweis: Bei mir variieren diese breaks von Laufzeit zu Laufzeit, da es immer wieder Zufälle und Unwägbarkeiten gibt (Threads/Timeing etc.)...

    PS: Die Frage an die Mods hier. Es ist keine Compiler Frage, es ist keine WinAPI Frage, IMHO am nächsten hat es noch mit der MFC zu tun. Es geht um die MS-CRT... wohin gehört sowas)?



  • @martin-richter sagte in _CrtSetBreakAlloc schlägt nicht an:

    wohin gehört sowas?

    In das Betriebssysteme\Windows-Forum, das ich in der Forentechnik innert einer neuen Forenstruktur vorgeschlagen habe und dafür nur laughs geerntet habe.



  • @swordfish

    @swordfish sagte in _CrtSetBreakAlloc schlägt nicht an:

    In das Betriebssysteme\Windows-Forum, das ich in der Forentechnik innert einer neuen Forenstruktur vorgeschlagen habe und dafür nur laughs geerntet habe.

    Nein! Das ist "wenn schon" Compiler relevant! Mit Betriebssystem hat das nichts zu tun.
    Aber das ist für diesen Thread OT...



  • @martin-richter sagte in _CrtSetBreakAlloc schlägt nicht an:

    Nein! Das ist "wenn schon" Compiler relevant!

    Mhm. Und welcher Compiler außer MS cl?


  • Mod

    @swordfish sagte in _CrtSetBreakAlloc schlägt nicht an:

    @martin-richter sagte in _CrtSetBreakAlloc schlägt nicht an:

    Nein! Das ist "wenn schon" Compiler relevant!

    Mhm. Und welcher Compiler außer MS cl?

    Und? Du bestätigst doch bloß, dass dies nichts mit Windows zu tun hat, sondern mit einem ganz bestimmten Compiler/Entwicklungsumgebung zu tun hat und absolut gar nichts damit, dass das Programm unter Windows läuft.



  • M.E. gehört dieser Thread (bei der jetzigen Foren-Struktur) am ehesten in das Compiler- und IDE-Forum.


Anmelden zum Antworten