Avatar billede kasseper Nybegynder
27. juni 2003 - 11:08 Der er 14 kommentarer og
1 løsning

Threads og stacktrace

Jeg skal bruge en specifik tråds stacktrace.
Jeg ved at jeg kan kalde dumpStack, men den skriver ud til System.out, og jeg vil gerne have det i en printstream som i throwable objectet's printStrackTrace metode.
Og det duer ikke at skifte System.out ud midlertidigt.
Ergo, skal jeg ha en enkel trå til at smide en exception, uden at tråden bliver påvirket.....????

Hvad skal jeg gøre ?
Avatar billede arne_v Ekspert
27. juni 2003 - 11:14 #1
Kan du ikke:

try {
  throw new Exception("bogus exception");
} catch(Exception ex) {
  ex.printStackTrace();
}

?
Avatar billede kasseper Nybegynder
27. juni 2003 - 11:18 #2
Nej for så bliver det currentThread der skrives ud, og ikke den Thread jeg har som object.....

Jeg tager f.eks. Thread.currentThread().getThreadGroup()
og løber gruppen igennem og vil så gerne skrive hver stacktrace for hver thread i Thread.currentThread().getThreadGroup() ud !
Avatar billede arne_v Ekspert
27. juni 2003 - 11:27 #3
OK.

(dumpStack er også for current thread, så derfor ...)
Avatar billede jakoba Nybegynder
27. juni 2003 - 11:28 #4
Nå du ønsker en stacktrace, må der vel være et punkt i den tråd hvor den stacktrace skal aktiveres der placeres arnes kode (lidt udvidet):

kan du ikke give dine tråde et unikt id som du så kan teste 'den' tråd imod

try {
  if ( DenneThread.unikId == mainClassStatic.valgtThreadId )
      throw new Exception("bogus exception");
} catch(Exception ex) {
  ex.printStackTrace();
}
Avatar billede arne_v Ekspert
27. juni 2003 - 11:29 #5
Er det en mullighed med at kalde interrupt på tråden og så
fange den på passende vis i tråden ?
Avatar billede kasseper Nybegynder
27. juni 2003 - 11:57 #6
Problemet er at det ikke er mine egne tråde....
Det er den j2ee container's tråder jeg gerne vil overvåge...!
Jeg henter alle tråde i java processen ud og skal nu skrive deres nuværende position ud....!
Avatar billede arne_v Ekspert
27. juni 2003 - 13:04 #7
Så tror jeg der er yderligere komplikationer, fordi så er de tråde jo ikke
startet af din tråd.

Kan du ikke angribe problemet på anden vis.
Avatar billede magoo20000 Nybegynder
27. juni 2003 - 17:56 #8
Hvad er det for en J2EE container du benytter?
Avatar billede jakoba Nybegynder
27. juni 2003 - 18:03 #9
"jeg henter alle tråde i java processen ud"

betyder det ikke at du har en unik reference til de tråde inklusive den du vælger at fokusere på.

Så burde det vel også være muligt at indsætte en test som ovenfor i en klasse der bruges af den tråd.
Avatar billede arne_v Ekspert
27. juni 2003 - 18:43 #10
Jeg formoder at det er fordi de ikke hænger i hans kode.

Der er temmelig meget ikke-user kode i en J2EE container.
Avatar billede kasseper Nybegynder
30. juni 2003 - 09:22 #11
Jeg kører på en apache tomcat.
Det der er humlen er at jeg tager currentThread, dernæst den threadGroup, og dernæst dens parrent og igen dens parrent indtil jeg når root.
Så har jeg lavet en rekursiv metode der gennemløger alle trådene i root, og alle dens 'børne' threadGroups. Så har jeg alle trådene, og jeg vil gerne lave et dump. OG JA jeg har en unik reference til alle trådene, men jeg kan ikke få den til at kaste en exception. HVis jeg gør som ovenfor, er det currentThread der er kasteren uanset hvilken tråd jeg for til at fejle....
Avatar billede jakoba Nybegynder
30. juni 2003 - 10:03 #12
Kasteren vil vel pr definition altid være currentThread; dvs den tråd der er igang med at eksekvere kode
    if ( currentThread == udValgtThreadId )
eller hur?
Avatar billede kasseper Nybegynder
30. juni 2003 - 12:47 #13
(ADVARSEL : pas på lange hår i pizzaen.... :) )

Yeps præcis.
Problemet er at sådan som kaldet til dumpStack er implementeret er at tråden kaster en exception og printer den exception ud.
Det er ikke særlig pænt, men sådan er det, det jeg så forestillede mig var at en tråd måske havde en eller anden metode, som hvis jeg kaldte den, med en obskur parameter, kastede en fejl tilbage.
Jeg har så siden hen forsøgt mig med setPriority(Thread.MAX_PRIORITY + 1), og det kaster en fejl, men igen er det min currentThread der kaster den, bugger.
Det jeg søger er det samme som hvis man i konsollen trykker CTRL+BREAK, så laver den et thread dump.....

ANYWAY, så har jeg konsulteret mit lokale java orakle, (en hård hård fyr der har skrevet sin egen java kompiler....geeee), han siger at det ér, som vi pt. har fundet ud af, med dumpStack.
Min eneste mulighed er at benytte JDI.(Java Debugging Interface)

Her kan man via en bootstrap rutine oprette en virtualMachineManeger, der kan debugge på en eksisterende VM.
Problemmet er så bare at man er nød til at starte den eksisterende VM (altså min app.server) med nogle debug parametre, og det er jeg ikke interesseret i, da det kører et stabilt miljø idag, og der skal ikke rodes med eksisterende rutiner, bla.bla.bla.
ANYWAY 2: Jeg har fundet en side hvor en person ser ud til at have gjort hvad jeg vil, men jeg kan ikke helt gennemskue det, se her :


http://www.fawcette.com/javapro/2002_09/magazine/columns/proshop/default_pf.asp

Jeg kan så ikke gennemskue hvilke parametre der skal bruges i oprettelsen af connectoren... Hjælp modtages...
Avatar billede kasseper Nybegynder
30. juni 2003 - 12:50 #14
sagen er nemli den at man, hvis man har en VirtualMachine connected op mod den JVM, som kører min app server, kan jeg hente alle de Tråde ud som jeg gør idag også( her hedder det bare ThreadReference ), og på dem kan jeg så hente stackFrames ud....
Avatar billede kasseper Nybegynder
04. december 2003 - 09:57 #15
lukkes
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester