It is not clear why the debugger sometimes locks up at startup.
* a race condition between the IDE and the debugger for a resource ?
* an infinite loop in output message events ?
* a deadlock with threads ?
* The Antivirus ?
no way to know for sure ... but since reducing CPU affinity helps, my favorite is #1. With only 1 CPU we a have a winner and no photo finish :)
EDIT : here is the thread that lead me to this solution, and indeed I have F-Secure AntiVirus.... https://stackoverflow.com/questions/51623474/delphi-10-2-3-hangs-when-starting-with-debugging-a-32-bit-application
Since then, I'm now in RIO 10.3 but F-secure did not fix the issue yet ... and disabling the AV is hardly a solution. Time to send a mail to F-secure, but in the meantime... let's try to code the affinity trick.
Okay, and what do we code now ? Hey, just set the affinity by code and we are good to go !
Let's try to create a package the IDE will load every time :
Create a new package and name it "CPUIAffinityPack", the dpk should look like this :
package CPUAffinityPack; {$R *.res} {$IFDEF IMPLICITBUILDING This IFDEF should not be used by users} {$ALIGN 8} {$ASSERTIONS ON} {$BOOLEVAL OFF} {$DEBUGINFO OFF} {$EXTENDEDSYNTAX ON} {$IMPORTEDDATA ON} {$IOCHECKS ON} {$LOCALSYMBOLS OFF} {$LONGSTRINGS ON} {$OPENSTRINGS ON} {$OPTIMIZATION ON} {$OVERFLOWCHECKS OFF} {$RANGECHECKS OFF} {$REFERENCEINFO OFF} {$SAFEDIVIDE OFF} {$STACKFRAMES OFF} {$TYPEDADDRESS OFF} {$VARSTRINGCHECKS ON} {$WRITEABLECONST OFF} {$MINENUMSIZE 1} {$IMAGEBASE $400000} {$DEFINE RELEASE} {$ENDIF IMPLICITBUILDING} {$DESCRIPTION 'CPU Affinity Pack'} {$DESIGNONLY} {$IMPLICITBUILD ON} requires rtl, vcl, designide; contains Affinity in 'Affinity.pas'; end.
And add a new unit named "Affinity.pas" written like this ::
unit Affinity; {$IFDEF SINGLE} {$DESCRIPTION 'CPU Affinity Pack Single Core One'} {$ENDIF} interface implementation Uses Winapi.Windows, Winapi.Messages, ToolsAPI, System.SysUtils, System.Variants, System.Types, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, StrUtils, Math, Menus; var p: word; cpus: string; affinity_mask: DWORD_PTR; c: TStringDynArray; procedure SetAffinity(vMaskProcess: DWORD_PTR); var vHandle: Cardinal; begin vHandle := GetCurrentProcess; if not SetProcessAffinityMask(vHandle, vMaskProcess) then showmessage(sysErrorMessage(getLastError)); end; procedure InitializeAffinity; begin {$IFDEF DEBUG} ShowMessage('Affinity package loaded'); {$ENDIF} {$IFDEF SINGLE} cpus := '1'; {$ELSE} cpus := ''; {$ENDIF} for p := 1 to paramcount do begin if uppercase(copy(paramstr(p), 1, 10))='-AFFINITY:' then begin cpus := copy(paramstr(p), 11, length(paramstr(p))-10); break; end; end; if cpus<>'' then begin {$IFDEF DEBUG} ShowMessage('Affinity '+cpus); {$ENDIF} affinity_mask := 0; c := SplitString(cpus, ','); for p := low(c) to high(c) do begin if StrToIntDef(c[p], -1)>-1 then affinity_mask := affinity_mask or (1 shl StrToIntDef(c[p], 0)); end; if affinity_mask>0 then SetAffinity(affinity_mask); {$IFDEF DEBUG} ShowMessage('Affinity mask '+inttostr(affinity_mask)); {$ENDIF} SetLength(c, 0); end; end; initialization InitializeAffinity; end.
Build and install the package.
Use the conditional defines SINGLE to force single core.
or edit the rad studio shortcut and add the new parameter -AFFINITY:1,3 to specify the cores number you want to activate (but leave only one if you want to fix the debugger issue)
Check affinity with the task manager
Tada ! Enjoy !