Newsgroup: it.comp.lang.visual-basic
Titolo: [?] Impossibile terminare il processo... debugger (VB5 e W2k)

Wow.. quanto tempo dall'ultima richiesta.. :)
Scenario: VB5 SP3 e Windows 2000 Pro SP1
Sviluppando un progettino client/server che utilizza DAO 3.5 e
Winsock ogni tanto (raramente però) mi capita che il programma,
eseguito all'interno dell'IDE, senza che nessuno lo utilizzi, si fermi
del tutto.. non viene più ridisegnato lo schermo, gli eventi non
vengono più generati, ctrl+break non funziona neanche.
sarei costretto a terminare il processo, ma..., sia che killo il
progetto in esecuzione, sia l'IDE di VB, Windows mi risponde
con "Impossibile terminare il processo. Se il debugger è attivo
chiudere il debugger prima di terminare il processo" (o qualcosa
del genere.. non si verifica spesso e non riesco a prevederlo)
Il progetto non utilizza nessuna api pericolosa..
si impalla pure senza far nulla, con il suo form principale aperto;
nessun timer avviato, nessuna connessione remota, niente subclassing.
Comprendo la difficoltà di diagnosticare un problema del genere
senza uno stralcio di codice, anche perché non c'è un codice che difet-
ta. In runtime non da nessun problema e neanche in W9x
A qualcuno è mai capitata una cosa del genere?
Come si può risolvere?
Di che debugger parla Windows?!?
--
Fibia "Sakamoto" FBI
E-mail: 
fibi...@hotmail.com
ICQ UIN 63586057
Sito Personale: 
http://www.geocities.com/fibiafbi
VB Simple: 
http://vbsimple.virtualave.net
Membro #26 delle Mitiche Brigate Takahashi sezione Sud

mi pare si tratti del tipico problema di memoria...
la memoria di win 'finisce', semplicemente...
il primo avviso č che non ridisegna gli oggetti dello schermo...
lui č fatto cosě...
hai qualche ciclo che si pappa tutta la memoria...
hola...
-> GbC

 hai qualche ciclo che si pappa tutta la memoria...
ZERO pennelli, brush, bitmap
č un programma che lavora solo con DB e qualche piccola elabo-
razione.. tutti gli oggetti allocati sono chiusi e deallocati..



Hai parlato di winsock... che fai di bello?
E le connection i db come sono?
ciao
ugo

 E le connection i db come sono?
Ho solo 3 oggetti globali
Public DBARCHIVIO As DAO.Database
Public RSARCHIVIO As DAO.Recordset
Public RSCODEAN As DAO.Recordset
allocati nella sub Main() ed utilizzati da tutti i forms.
Sul Form_Unload c'č invece la relativa deallocazione
RSCODEAN.Close
RSARCHIVIO.Close
DBARCHIVIO.Close
Set RSCODEAN = Nothing
Set RSARCHIVIO = Nothing
Set DBARCHIVIO = Nothing
ripeto.. durante l'esecuzione del programma di appeso ci sono soltanto
quei tre oggetti. Come diceva l'insegnate di VBEnry, la prima cosa da fare
dopo un If č l'End If.
la connessione al db č aperta con:
VALREG = LoadINI(MeEXE(App, "INI"), "Archivio", "Posizione", 255)
Set DBARCHIVIO = DBEngine.OpenDatabase(VALREG)
MeEXE restituisce il percorso e nome del file exe con l'estensione da me
voluta (INI). LoadINI non la commento neanche :)
Sono tutte funzioni che utilizzo da anni e non hanno mai generato di questi
problemi. Su Win9x funziona tutto.
Che piffero č il debugger di cui parla Win2k?
Non ho subclassato nulla.


 Non ho subclassato nulla.
dai, qualche cosa di "storto" ci deve essere...
continuiamo ad indagare...
che fa "funzionalmente" ad ora l'app...?
ciao
ugo

 che fa "funzionalmente" ad ora l'app...?
in generale, apre certi recordset, elabora dei dati, li aggiorna e li
trasferisce
in altri recordset per trasferirli poi tramite winsock (ancora non è pronto
il
codice di trasferimento) + varie operazioni idiote (stampe, informazioni a
video, etc..) tutte tramite codice VB.
Utilizzo solo Common controls 5, Winsock ed una mia dll ActiveX ultracol-
laudata da oltre 2 anni.
l'ultimo blocco che mi ha davvero rotto (anche perchè ho perso un bel po' di
codice) è avvenuto in pieno IDLE: lancio il form, mi alzo dalla scrivania
per
avviare telnet su un altro pc, ritorno e trovo tutto bloccato.
non mi ha dato fastidio il fatto che si sia bloccato il progetto, ma che
win2k non
lo riesca a chiudere, né con il task manager né facendo il logoff. è
obbligatorio
lo shutdown. "Chiudere il debugger prima di terminare il processo"
roarr..
mi sa che la archivierò nella cartella delle pratiche insolute :P


mi sa che la archivierò nella cartella delle pratiche insolute :P
Eh, no: ora ci hai messo l' elefante nell' orecchio :-)
ciao, hal


Ah... ecco cos'era quel fastidio dietro la mandibola...
:-PPP
ciao
ugo

:-PPP
ROTFL 
:DDDDDDDDDDD

 Eh, no: ora ci hai messo l' elefante nell' orecchio :-)
la cosa "chi mmi spara 'nta l'ossa" č che neanche Administrator riesce a
chiudere il processo congelato...
ho sempre inteso Administrator come il Root linux ovvero con il suo
potenziale distruttivo di buttare giů il computer per la chiusura di un pro-
cesso di sistema ed invece non č cosě!
administrator č un misero utente con qualche privilegio in piů ma non puň
essere considerato un amministratore... Piů uso windows piů ho voglia di
usare linux...
anzi.. ho un'idea migliore..
Fibia Windows NT 6 Project
// Installation procedure
#define OKOnly 0
printf("Do not turn off your pc now or all your money will be
  "transferred to Bill Gates bank account\n\n");
            // Disable CTRL+ALT+DEL
SystemParametersInfo 97, TRUE, 0, 0
MessageBox 0, "Do you agree to MS total destructive license?", OkOnly
time=getTime();
fID= fopen("MSrndfile", "rw");
printf("New Windows NT 6 installs on the same time for all computers "
  "regardless the PC used and for components required\n\n");
printf("Please wait...\n");
while(getTime() < time + 300)
  fwrite(fID, rand * 256);
fclose(fID);
int segments = rand * 5000;
System.SplitFile("MSrndfile", "c:\\", segments);
System.DetectHardware();
ShowBSOD();
// This prevents any damage to the pc caused from user's blasphemies
Audio.Microphone(TURNED_OFF);
if((getTime() mod 2) == 0)
   System.Hangs()
else
{
  ShowBSOD();
  System.Reboot();
}
// Win2k secret boot sector source code:
System.ScrewOtherPartitions(TRUE);
echo "Bill Gates rulez" > bootflag
dd if=bootflag of=/dev/hda
dd if=/dev/rnd of=/dev/hda1
// Bill Gates' secret patch
run usr/sbin/WMWare    ' ROTFL
// Administrator user creation procedure
char *user = System.getdefaultuser();
char *buffer = (char *) malloc(256);
strcpy(user->name, "administrator");
user->permissions = System.InheritsPermissions("guest");
// Logon procedure
printf("Welcome to NT 6.66. Press CTRL+ALT+CANC to logon\n");
_getchar();
ShowSplashScreen();
printf("Please insert your password\n");
getc(buffer);
if(strcomp(buffer, user->password) == 0)
{
  WaitFor(Internet.Connect());
   Internet.ConnectToHostname("
http://www.microsoft.com/billgates
");
   Internet.sendData(user->name);
   Internet.sendData(user->password);
   Internet.sendData(user->creditCardNumber);
   Internet.OpenPorts("IE5.5", 1, 65535);
   SetTimeOut(Internet.WaitForIncomingVirus("W32.*"), 5000);
   Logon();
}
else
{
   printf("Wrong password\nYour HDD is going to be damaged\n");
   for(int i = 0; i < 65535; i++)
     System.writeData(1, (char *) rand * 256, 1);
}
// Shutdown procedure
#define NOCONFIRM 1
while(processes.count > 0)
{
  if(System.TryToClose() != 0)
  {
    System.BruteForceClose();
    System.ScrewAllUnsavedData(TRUE, NOCONFIRM);
  }
}
RewriteBootSectorWithJunkData();
printf("Is now possible turn off the computer\0Bill Gates rules");
chiedo scusa a tutti i veri programmatori C :))


 Di che debugger parla Windows?!?
Prova, questo per pura mia curiosità, a chiamare la funzione 
IsDebuggerPresent

 printf("Is now possible turn off the computer\0Bill Gates rules");
Attento che il tuo "suggerimento" potrebbe essere accolto...   :-P
ri-ROTFL
ciao
ugo

usare linux...
^___^
ciao, hal

 IsDebuggerPresent
Public Declare Function IsDebuggerPresent Lib "kernel32.dll" () As Long
? IsDebuggerPresent
restituisce 0 :((((



Per questo ti chiedo: avviene solo su 1 macchina?
Non sarà che cerchiamo un errore di codice dove c'è un errore di sistema?
ciao
ugo

 Non sarà che cerchiamo un errore di codice dove c'è un errore di sistema?
boh.. possibile!
purtroppo ho solo questo Win2k
tutte le altre stazioni utilizzano Win9x :(
--
Fibia "Un-signed" FBI

nome.
http://www.sysinternals.com/
, pstools. Ha un comando kill un po' piů 
furbo (se necessario cerca di forzare i permessi - permette di ammazzare 
anche i servizi). Ma il problema č che se il programma č inchiodato per 
ragioni "improrogabili" (come il messaggio sul debugger suggerirebbe), 
non c'č santo che tenga

restituisce 0 :((((
Non so proprio :/

 del genere.. non si verifica spesso e non riesco a prevederlo)
Forse ho trovato qualcosa!!!!
oggi si è verificato il problema di nuovo ma mi son fatto furbo :P
ho lasciato attendere il processo per circa 4 minuti senza killarlo
e mi è uscito questo messaggio di NT
"Errore durante la riconnessione di T: a \\Casse\Terminalini
Rete di Microsoft Windows: Nome di periferica locale già in uso.
La connessione non è stata ripristinata."
ho provato e riprovato 5-6 volte ed è spuntato sempre lo stesso
messaggio. il problema avviene quando il computer remoto
\\CASSE va in stand-by o in modalità doze.
svegliando il pc il problema ha continuato a presentarsi
ho dovuto disconnettere l'unità mappata e riconnetterla.. così sembra
risolto.. la cpu stava a 0%
spero che il problema fosse quello, ma non ne son molto sicuro.
attendo sviluppi... ma esiste un modo di impedire ad un pc di andare
in stand-by via codice? ovvero senza modificare le opzioni del computer
server, poiché il programma potrebbe essere installato ovunque...
--
Fibia "Odio la microsoft!!!!" FBI


 server, poiché il programma potrebbe essere installato ovunque...
Non credo.
Oltretutto, se tu lo facessi da codice probbilmente presso questo "ovunque"
ci sarebbe qualche "mago del computer" che lo definirebbe un baco tuo...
Ti conviene pecificare che lo standby deve essere disattivato nella
circostanza "tale" nelle note di installazione e/o (ma direi "e") trappare
la casistica di errore all'interno del tuo programma.
ciao
ugo

 la casistica di errore all'interno del tuo programma.
difficile da fare...
durante questo stato di "disconnessione" il codice si ferma del tutto per
circa
4-5 minuti... non mi pare una buona gestione degli errori dopo 5 minuti.
inoltre la finestra che appare non appartiene a VB ma a Windows.
Il programma ha una sua funzione di rimpiazzamento automatico del database:
se il db remoto non è disponibile perché disconnesso utilizza
automaticamente
una copia del db ma in locale...
ed infatti il programma non dava alcun errore di runtime.. appare la
finestra di
windows con tale messaggio e viene utilizzato regolarmente il db locale..
disa-
bilitando il cambio di db appare invece l'errore di db non trovato :(
mah.. almeno lo so
--
Fibia "Sakamoto" FBI


 inoltre la finestra che appare non appartiene a VB ma a Windows.
Ergo: torniamo all'ipotesi del problema sistemistico
ciao
ugo

 
Prova a guardare l'help del messaggio WM_POWERBROADCAST.
Viene mandato a tutte le applicazioni anche quando il pc stà per entrare
in stand-by.
Inoltre mi sono imbattuto per caso in una funzione che cercavo
inutilmente da molto tempo. SetThreadExecutionState.
-- 
Samuele Battarra
prova il mio newsreader:
http://digilander.iol.it/battarsa/programmi/news/

 in stand-by.
ottimissima idea..
mi rompo un po' a subclassare il programma, ma...
--
Fibia "Un-signed" FBI