public inbox for frysk-cvs@sourceware.org help / color / mirror / Atom feed
From: cagney@sourceware.org To: frysk-cvs@sourceware.org Subject: [SCM] master: frysk-core/frysk/hpd/ChangeLog Date: Mon, 25 Feb 2008 17:17:00 -0000 [thread overview] Message-ID: <20080225171719.25946.qmail@sourceware.org> (raw) The branch, master has been updated via cc4b69ddad67f0d3efcb1574f32f37d0ad3e92e6 (commit) from 8ae8b5bbf07d2a0dde2b5db8bcf01199e3ea2ced (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email. - Log ----------------------------------------------------------------- commit cc4b69ddad67f0d3efcb1574f32f37d0ad3e92e6 Author: Andrew Cagney <cagney@redhat.com> Date: Mon Feb 25 12:15:29 2008 -0500 frysk-core/frysk/hpd/ChangeLog 2008-02-25 Andrew Cagney <cagney@redhat.com> * LoadCommand.java: Use LinuxExeFactory. frysk-core/frysk/proc/dead/ChangeLog 2008-02-25 Andrew Cagney <cagney@redhat.com> * LinuxExeFactory.java: New. Merge in LinuxExeHost, LinuxExeProc, and LinuxExeTask. * LinuxExeHost.java: Simplify. * LinuxExeProc.java: Simplify. * LinuxExeTask.java: Simplify. * ExeByteBuffer.java (ExeByteBuffer(MemoryMap[])): Replace ExeByteBuffer(ArrayList). * TestLinuxExe.java: Update. frysk-core/frysk/util/ChangeLog 2008-02-25 Andrew Cagney <cagney@redhat.com> * ProcStopUtil.java: Use LinuxExeFactory. ----------------------------------------------------------------------- Summary of changes: frysk-core/frysk/hpd/ChangeLog | 4 + frysk-core/frysk/hpd/LoadCommand.java | 11 +-- frysk-core/frysk/proc/dead/ChangeLog | 11 +++ frysk-core/frysk/proc/dead/ExeByteBuffer.java | 53 +++++------- .../{LinuxExeTask.java => LinuxExeFactory.java} | 85 ++++++++---------- frysk-core/frysk/proc/dead/LinuxExeHost.java | 92 ++------------------ frysk-core/frysk/proc/dead/LinuxExeProc.java | 67 ++++----------- frysk-core/frysk/proc/dead/LinuxExeTask.java | 35 ++------ frysk-core/frysk/proc/dead/TestLinuxExe.java | 75 ++-------------- frysk-core/frysk/util/ChangeLog | 4 + frysk-core/frysk/util/ProcStopUtil.java | 7 +- 11 files changed, 128 insertions(+), 316 deletions(-) copy frysk-core/frysk/proc/dead/{LinuxExeTask.java => LinuxExeFactory.java} (61%) First 500 lines of diff: diff --git a/frysk-core/frysk/hpd/ChangeLog b/frysk-core/frysk/hpd/ChangeLog index 7862c42..fc9b4d7 100644 --- a/frysk-core/frysk/hpd/ChangeLog +++ b/frysk-core/frysk/hpd/ChangeLog @@ -1,3 +1,7 @@ +2008-02-25 Andrew Cagney <cagney@redhat.com> + + * LoadCommand.java: Use LinuxExeFactory. + 2008-02-21 Nurdin Premji <npremji@redhat.com> * StepCommand.java (StepCommand): Added -instruction parameter. diff --git a/frysk-core/frysk/hpd/LoadCommand.java b/frysk-core/frysk/hpd/LoadCommand.java index bbd9893..4bc03ae 100644 --- a/frysk-core/frysk/hpd/LoadCommand.java +++ b/frysk-core/frysk/hpd/LoadCommand.java @@ -40,16 +40,12 @@ package frysk.hpd; import java.io.File; -//import java.util.HashMap; import java.util.Iterator; -//import java.util.Map; -//import java.util.Set; +import frysk.proc.dead.LinuxExeFactory; import frysk.debuginfo.DebugInfo; import frysk.debuginfo.DebugInfoFrame; import frysk.debuginfo.DebugInfoStackFactory; import frysk.dwfl.DwflCache; -import frysk.proc.Host; -import frysk.proc.dead.LinuxExeHost; import frysk.proc.Manager; import frysk.proc.Proc; import frysk.proc.Task; @@ -112,8 +108,9 @@ public class LoadCommand extends ParameterizedCommand { ("File does not exist or is not readable or is not a file."); } - Host exeHost = new LinuxExeHost(Manager.eventLoop, executableFile); - Proc exeProc = frysk.util.Util.getProcFromExeFile(exeHost); + Proc exeProc = LinuxExeFactory.createProc(Manager.eventLoop, + executableFile, + cmd.stringArrayValue()); int procID; if (cli.taskID < 0) diff --git a/frysk-core/frysk/proc/dead/ChangeLog b/frysk-core/frysk/proc/dead/ChangeLog index a79fb3b..f09f868 100644 --- a/frysk-core/frysk/proc/dead/ChangeLog +++ b/frysk-core/frysk/proc/dead/ChangeLog @@ -1,3 +1,14 @@ +2008-02-25 Andrew Cagney <cagney@redhat.com> + + * LinuxExeFactory.java: New. Merge in LinuxExeHost, LinuxExeProc, + and LinuxExeTask. + * LinuxExeHost.java: Simplify. + * LinuxExeProc.java: Simplify. + * LinuxExeTask.java: Simplify. + * ExeByteBuffer.java (ExeByteBuffer(MemoryMap[])): Replace + ExeByteBuffer(ArrayList). + * TestLinuxExe.java: Update. + 2008-02-20 Andrew Cagney <cagney@redhat.com> * LinuxExeProc.java (sendRefresh()): Delete. diff --git a/frysk-core/frysk/proc/dead/ExeByteBuffer.java b/frysk-core/frysk/proc/dead/ExeByteBuffer.java index cde7b8d..59f6d09 100644 --- a/frysk-core/frysk/proc/dead/ExeByteBuffer.java +++ b/frysk-core/frysk/proc/dead/ExeByteBuffer.java @@ -1,6 +1,6 @@ // This file is part of the program FRYSK. // -// Copyright 2007, Red Hat Inc. +// Copyright 2007, 2008, Red Hat Inc. // // FRYSK is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by @@ -40,52 +40,41 @@ package frysk.proc.dead; import java.io.File; -import java.util.ArrayList; -import java.util.Iterator; - import frysk.sys.StatelessFile; import frysk.proc.MemoryMap; - import inua.eio.ByteBuffer; public class ExeByteBuffer extends ByteBuffer { - ArrayList metaData = new ArrayList(); + private final MemoryMap[] memoryMaps; + private final StatelessFile[] statelessFiles; + private final byte[] buffer = new byte[1]; - protected ExeByteBuffer(long lowWater, long highWater) { - super(lowWater, highWater); - } - - public ExeByteBuffer(ArrayList metaData) - { + public ExeByteBuffer(MemoryMap[] memoryMaps) { super(0,-1); - - this.metaData = metaData; + this.memoryMaps = memoryMaps; + this.statelessFiles = new StatelessFile[memoryMaps.length]; } protected int peek(long caret) { - - Iterator i = metaData.iterator(); - MemoryMap line = null; long offset = -1; - byte[] buffer = new byte[1]; - - while (i.hasNext()) - { - line = ((MemoryMap)i.next()); - if ((caret >= line.addressLow) && (caret<= line.addressHigh)) - { - offset = line.offset + (caret - line.addressLow); - break; - } + int i; + MemoryMap line = null; + for (i = 0; i < memoryMaps.length; i++) { + line = memoryMaps[i]; + if ((caret >= line.addressLow) && (caret<= line.addressHigh)) { + offset = line.offset + (caret - line.addressLow); + break; + } } - - if (offset == -1) + if (i >= memoryMaps.length) throw new RuntimeException("Cannot find memory in exe file"); - - StatelessFile temp = new StatelessFile(new File(line.name)); + StatelessFile temp = statelessFiles[i]; + if (temp == null) { + temp = new StatelessFile(new File(line.name)); + statelessFiles[i] = temp; + } temp.pread(offset, buffer,0,1); - return buffer[0]; } diff --git a/frysk-core/frysk/proc/dead/LinuxExeTask.java b/frysk-core/frysk/proc/dead/LinuxExeFactory.java similarity index 61% copy from frysk-core/frysk/proc/dead/LinuxExeTask.java copy to frysk-core/frysk/proc/dead/LinuxExeFactory.java index 4d90354..28d0082 100644 --- a/frysk-core/frysk/proc/dead/LinuxExeTask.java +++ b/frysk-core/frysk/proc/dead/LinuxExeFactory.java @@ -39,59 +39,50 @@ package frysk.proc.dead; -import inua.eio.ArrayByteBuffer; -import inua.eio.ByteBuffer; -import frysk.isa.banks.RegisterBanks; -import frysk.isa.ISA; +import java.io.File; +import java.util.List; +import java.util.LinkedList; import lib.dwfl.Elf; import lib.dwfl.ElfCommand; import lib.dwfl.ElfEHeader; -import lib.dwfl.ElfException; -import java.io.File; - -public class LinuxExeTask extends DeadTask { - private final long pc; - private final LinuxExeProc proc; +import frysk.proc.MemoryMap; +import frysk.event.EventLoop; - LinuxExeTask(LinuxExeProc proc, ISA isa) { - super(proc, 0, isa, constructRegisterBanks(isa)); - this.proc = proc; - // Compute a Fake PC. XXX should be done in Proc instead of - // creating Elf object in the Task itself. - Elf e = null; - long pc; +public class LinuxExeFactory { + public static LinuxExeProc createProc(EventLoop eventLoop, + final File exeFile, + String[] args) { + Elf exeElf = null; try { - e = new Elf(new File(getProc().getExe()), ElfCommand.ELF_C_READ); - ElfEHeader h = e.getEHeader(); - pc = h.entry; - } catch (ElfException ee) { - // Nice try, just give up. - pc = 0; + exeElf = new Elf(exeFile, ElfCommand.ELF_C_READ); + ElfEHeader eHeader = exeElf.getEHeader(); + class BuildExeMaps extends SOLibMapBuilder { + private final List metaData = new LinkedList(); + public void buildMap(long addrLow, long addrHigh, boolean permRead, + boolean permWrite, boolean permExecute, + long offset, String name, long align) { + metaData.add(new MemoryMap(addrLow, addrHigh, permRead, + permWrite, permExecute, false, + offset, -1, -1, -1, -1, -1, + exeFile.getAbsolutePath())); + } + MemoryMap[] getMemoryMaps() { + MemoryMap[] memoryMaps = new MemoryMap[metaData.size()]; + metaData.toArray(memoryMaps); + return memoryMaps; + } + } + BuildExeMaps SOMaps = new BuildExeMaps(); + // Add in case for executables maps. + SOMaps.construct(exeFile, 0); + + LinuxExeHost host + = new LinuxExeHost(exeFile, eHeader, SOMaps.getMemoryMaps(), + args); + return host.getProc(); } finally { - if (e != null) - e.close(); + if (exeElf != null) + exeElf.close(); } - this.pc = pc; - } - - public long getPC() { - return pc; - } - - public ByteBuffer getMemory() { - return proc.getMemory(); } - - private static RegisterBanks constructRegisterBanks(ISA isa) { - ByteBuffer[] bankBuffers = new ByteBuffer[4]; - // Create an empty page - byte[] emptyBuffer = new byte[4096]; - for (int i = 0; i < emptyBuffer.length; i++) - emptyBuffer[i] = 0; - bankBuffers[0] = new ArrayByteBuffer(emptyBuffer); - bankBuffers[1] = new ArrayByteBuffer(emptyBuffer); - bankBuffers[2] = new ArrayByteBuffer(emptyBuffer); - bankBuffers[3] = new ArrayByteBuffer(emptyBuffer); - return CorefileRegisterBanksFactory.create(isa, bankBuffers); - } } diff --git a/frysk-core/frysk/proc/dead/LinuxExeHost.java b/frysk-core/frysk/proc/dead/LinuxExeHost.java index 7dd7431..a9932e0 100644 --- a/frysk-core/frysk/proc/dead/LinuxExeHost.java +++ b/frysk-core/frysk/proc/dead/LinuxExeHost.java @@ -40,100 +40,24 @@ package frysk.proc.dead; import java.io.File; -import java.util.Iterator; -import java.util.List; -import java.util.LinkedList; - -import lib.dwfl.Elf; -import lib.dwfl.ElfCommand; -import lib.dwfl.ElfData; import lib.dwfl.ElfEHeader; -import lib.dwfl.ElfPHeader; - -import frysk.event.EventLoop; -import frysk.proc.Proc; -import frysk.proc.ProcId; +import frysk.proc.MemoryMap; public class LinuxExeHost extends DeadHost { - - protected File exeFile = null; - EventLoop eventLoop = null; - Elf exeFileElf = null; + private final File exeFile; + private final LinuxExeProc proc; - public LinuxExeHost(EventLoop eventLoop, File exeFile) { + LinuxExeHost(File exeFile, ElfEHeader eHeader, MemoryMap[] memoryMaps, + String[] args) { this.exeFile = exeFile; - this.eventLoop = eventLoop; - this.exeFileElf = new Elf(exeFile, ElfCommand.ELF_C_READ); - // Iterate (build) the /proc tree, passing each found PID to - // procChanges where it can update the /proc tree. - // Changes individual process. - new DeconstructExeFile(this.exeFileElf); - for (Iterator i = procPool.values().iterator(); i.hasNext();) { - LinuxExeProc proc = (LinuxExeProc) i.next(); - proc.sendRefresh(); - } - } - - private class DeconstructExeFile - { - List addedProcs = new LinkedList(); - Elf exeFileElf; - ElfData noteData = null; - - DeconstructExeFile(Elf exeFileElf) - { - this.exeFileElf = exeFileElf; - ElfEHeader eHeader = this.exeFileElf.getEHeader(); - - // Get number of program header entries. - long phSize = eHeader.phnum; - for (int i=0; i<phSize; i++) - { - // Test if pheader is of types notes.. - ElfPHeader pHeader = exeFileElf.getPHeader(i); - if (pHeader.type == ElfPHeader.PTYPE_NOTE) - { - // if so, copy, break and leave. - noteData = exeFileElf.getRawData(pHeader.offset,pHeader.filesz); - break; - } - } - - if (noteData != null) - update(noteData); - } - - Proc update (ElfData proc_pid) - { - final ProcId procId = new ProcId(0); - // Currently there can only be one process per core file. - // What happens when we have two core files denoting the same - // process/pid? Leave the test here for now. - - Proc proc = (Proc) procPool.get(procId); - if (proc == null) - { - // executable file processes have no parents as thy are captured - // in isolation, and reconstructed. - proc = new LinuxExeProc(proc_pid,LinuxExeHost.this); - } - - addedProcs.add(proc); - - return proc; - } + proc = new LinuxExeProc(this, exeFile, eHeader, memoryMaps, args); } public String getName() { return exeFile.getName(); } - /** - * finalize closes the file descriptor for the executable. - */ - protected void finalize() - { - this.exeFileElf.close(); + LinuxExeProc getProc() { + return proc; } - } diff --git a/frysk-core/frysk/proc/dead/LinuxExeProc.java b/frysk-core/frysk/proc/dead/LinuxExeProc.java index 4732d0e..9616965 100644 --- a/frysk-core/frysk/proc/dead/LinuxExeProc.java +++ b/frysk-core/frysk/proc/dead/LinuxExeProc.java @@ -39,50 +39,45 @@ package frysk.proc.dead; -import inua.eio.ByteBuffer; - -import java.util.ArrayList; -import lib.dwfl.ElfData; - -import frysk.isa.ISA; -import frysk.isa.ElfMap; +import lib.dwfl.ElfEHeader; import frysk.proc.Auxv; import frysk.proc.MemoryMap; +import java.io.File; public class LinuxExeProc extends DeadProc { - private ElfData elfData = null; - ArrayList metaData = new ArrayList(); - LinuxExeHost host = null; + private final MemoryMap[] memoryMaps; + private final String[] argv; + private final File exeFile; - public LinuxExeProc(ElfData data, LinuxExeHost host) { + public LinuxExeProc(LinuxExeHost host, File exeFile, ElfEHeader eHeader, + MemoryMap[] memoryMaps, String[] argv) { super(host, null, 0); - this.host = host; - this.elfData = data; - sendRefresh(); - ISA isa = ElfMap.getISA(elfData.getParent().getEHeader()); - new LinuxExeTask(this, isa); - buildMetaData(); + this.exeFile = exeFile; + this.memoryMaps = memoryMaps; + this.argv = argv; + new LinuxExeTask(this, eHeader, memoryMaps); } public Auxv[] getAuxv() { - return null; + return auxv; } + private final Auxv[] auxv = new Auxv[0]; public int getUID() { return 0; } public String[] getCmdLine() { - return null; + return argv; } public String getCommand() { - return this.host.exeFile.getName(); + return exeFile.getName(); } public String getExe() { - return host.exeFile.getAbsolutePath(); + return exeFile.getAbsolutePath(); } public int getGID() { @@ -90,34 +85,6 @@ public class LinuxExeProc extends DeadProc { } public MemoryMap[] getMaps() { - return (MemoryMap[]) metaData.toArray(new MemoryMap[metaData.size()]); - } - - ByteBuffer getMemory() { - if (memory == null) - memory = new ExeByteBuffer(metaData); - return memory; + return memoryMaps; } - private ByteBuffer memory; - - private void buildMetaData() - { - class BuildExeMaps extends SOLibMapBuilder - - { - public void buildMap(long addrLow, long addrHigh, boolean permRead, - boolean permWrite, boolean permExecute, long offset, - String name, long align) - { - metaData.add(new MemoryMap(addrLow, addrHigh, permRead, - permWrite, permExecute, false, offset, -1, -1, -1, -1, -1, - host.exeFile.getAbsolutePath())); - } - } - - BuildExeMaps SOMaps = new BuildExeMaps(); - // Add in case for executables maps. - SOMaps.construct(this.host.exeFile, 0); - } - } diff --git a/frysk-core/frysk/proc/dead/LinuxExeTask.java b/frysk-core/frysk/proc/dead/LinuxExeTask.java index 4d90354..a762769 100644 --- a/frysk-core/frysk/proc/dead/LinuxExeTask.java +++ b/frysk-core/frysk/proc/dead/LinuxExeTask.java @@ -43,35 +43,20 @@ import inua.eio.ArrayByteBuffer; import inua.eio.ByteBuffer; import frysk.isa.banks.RegisterBanks; import frysk.isa.ISA; -import lib.dwfl.Elf; -import lib.dwfl.ElfCommand; import lib.dwfl.ElfEHeader; -import lib.dwfl.ElfException; -import java.io.File; +import frysk.isa.ElfMap; +import frysk.proc.MemoryMap; public class LinuxExeTask extends DeadTask { private final long pc; - private final LinuxExeProc proc; + private final ByteBuffer memory; - LinuxExeTask(LinuxExeProc proc, ISA isa) { - super(proc, 0, isa, constructRegisterBanks(isa)); - this.proc = proc; - // Compute a Fake PC. XXX should be done in Proc instead of hooks/post-receive -- frysk system monitor/debugger
next reply other threads:[~2008-02-25 17:17 UTC|newest] Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top 2008-02-25 17:17 cagney [this message] -- strict thread matches above, loose matches on Subject: below -- 2008-06-06 19:31 swagiaal 2008-03-17 19:09 cagney 2008-03-03 23:09 cagney 2008-02-26 16:54 cagney 2008-01-08 21:41 cagney
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20080225171719.25946.qmail@sourceware.org \ --to=cagney@sourceware.org \ --cc=frysk-cvs@sourceware.org \ --cc=frysk@sourceware.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).