Find objects currently in memory

I am currently helping a friend write a program that will take any object currently in memory with one of our applications and then return all the methods and public variables associated with that object.
Our goal is to find them in memory or get them from the JVM (we are unsure if this is possible). Currently we register them by hand by hard coding what classes we want our program to use. We want to use objects already in existence for debugging purposes.
Any help?

That hard part, is exactly what we need help with.
We appreciate anything help.see
http://java.sun.com/products/jpda/
From the URL
The Java Platform Debugger Architecture (JPDA) provides the infrastructure you need to build end-user debugger applications for the Java 2 Platform, Standard Edition (J2SE). It includes the following three-layered APIs:
Java Debug Interface (JDI), a high-level Java programming language interface, including support for remote debugging;
Java Debug Wire Protocol (JDWP), which defines the format of information and requests transferred between the debugging process and the debugger front end;
The JVM(TM) Tools Interface, JVM TI. This is a low-level native interface that defines the services a Java virtual machine provides for tools, including debugging. JVM TI is new in J2SE 5.0 and replaces JVMDI annd JVMPI, both of which are deprecated and will be removed in a future release.

Similar Messages

  • Find out current old heap usage from within the process

    Hello!
    We use the CMS garbage collector and need a way to find out how much memory is used of the old heap by reachable objects. This we have to do from within the process (not using jvmstat or jstat etc.).
    Since there is no way to distinguish between reachable and non-reachable objects (except for traversing the entire heap... -- or are there other possibilities?) our idea is to get the amount of used memory right after a garbage collection in the old heap.
    Using Java 1.5, this can be done by
    java.lang.management.MemoryPoolMXBean pool = <Pool for Old Generation>;
    pool.getUsage().getUsed();However, java.lang.management is only available in Java 1.5.
    Therefore my first question: Is there a similar way of finding out old heap usage in Java 1.4?
    There is another problem with this method: By calling pool.getUsage().getUsed();, one has to know when a GC has occurred (this could be done by calling it in an interval of x seconds -- if the current value is lower than the one before, a GC must hava occurred). A better way would be to use pool.getCollectionUsage().getUsed();, but this seems not to work for the CMS collector.
    Second question: Is pool.getCollectionUsage().getUsed(); really not working with CMS, or are we just doing it in a wrong way? Are there other ways of finding out the used memory in the old heap after a GC even when using the CMS?
    Thanks for any help!
    Regards,
    Nicolas Michael

    Hi Nicolas,
    There is no API in 1.4 to get the after GC memory usage of the old generation. The only thing close to it is (Runtime.totalMemory - Runtime.freeMemory) but it is the approx amount of memory used for the heap (not just the old generation).
    MemoryPoolMXBean.getCollectionUsage() returns the after GC MemoryUsage. This method should work for all collectors. I have a simple test case that shows it working fine with CMS. It shows the same value as the -XX:+PrintGCDetails shows.
    If you have a test case showing that this method doesn't work correctly, please submit a bug along with the test case. We'll investigate it.
    Thanks
    Mandy

  • How to find out how many memory is used for NIO

    is there any way to find out how many memory is used for nio in a virtual machine. ?
    I know that is possible to find out how many total, free and used memory the heap has by using java.lang.Runtime#totalMemory...
    We sometimes expect errors that it is not possible to create any more connections because of the NIO memory size but the heap is still ok. Today we had an error where 170mbytes of heap where left but it was not possible to create new tcp connections because of an exception:
    javax.naming.NamingException: java.net.SocketException: No buffer space available (maximum connections reached?): connect
    The number of TCP-Connections was ok (<500).
    It would be very nice if someone knows how to find out how the amount of memory that NIO buffers use can be determined within Java 1.4.
    best regards
    benjamin

    We have to use 1.4.2_03. This is because of the special environment we are running on.
    We did also figured out that there are some NIO Memory Bugs but we since we are not allowed to upgrade the used Virtual Machine we have to live with these errors.
    The problem that we currently have is within a Server and because of this circumstance we are trying to find a workaround or way to find out how many memory is allocated. If we would know how to get this value we could restart the servers as a workaround after the value reaches a threshold.
    We are also very sad that we can`t easily upgrade/update to the latest 1.4.2 Version or the newest 1.5 to get rid of these NIO Bugs!

  • Can I find the current tab in Terminal using applescript?

    Running a script from the shell by prepending
    #! /usr/bin/osascript
    as part of my .profile, can I find the "current" tab using Applescript. Most of the time, the "current" tab will not be visible, as the shell is being initialised, or re-initialised.
    I want to set the dircolors for my shell by determining the background color of the tab in which the shell is executing.

    Under the Window menu you can activate any of the palettes that you want. In your case the Field tab is under the Object palette

  • Find Object.vi function of 3D picture control - when object not found

    I am using Labview 8.2, and this post is regarding the 3D Picture Control.
    I am wanting to make use of the "Find Object" VI to either return a reference to a named object, or otherwise determine that it does not exist yet.  However, if I call it with the name of an object that doesn't exist yet (i.e. just any random string), it returns an error message that arises from the attempt to release a queue (the reference to which gets lost when crossing a zero-iteration For Loop's tunnels), instead of an error message that says "Object not found" which I would find much more useful.  With a simple modification of the "Find Object.vi" function, this behaviour can be changed, by replacing the For Loop's tunnels with shift registers.
    The problem with the current function is that the error is not an intentionally thrown error, rather just the result of the queue's refnum being set to the default 0 as it "exits" the For Loop, since in the situation that an object is not found, the code passes a 0 to the N terminal.
    The attached images show the problematic code and the simple modification
    Attachments:
    Find Object.png ‏2 KB
    Find Object_modified.png ‏2 KB

    pauldavey,
    I agree with you - the current way of handling the case of an object not being found does not appear to be ideal.
    This was reported to R&D (# 43D8GSVQ) for further investigation.
    Thanks for the feedback!
    Regards,
    Simon H
    Applications Engineer
    National Instruments

  • Examining all objects created in memory

    Is it possible to get a list/array/whatever of all object instances that are currently in memory, without using the JPDA to debug the virtual machine my code is running in?
    I am trying to write a utility to give developers at my company a "snapshot" of everything in memory, its not anything that would ever be used in a production environment. I would prefer to stay within the confines of standard API's and not have to do something like modify the java.lang.Object code file.
    Thanks,
    E.Otter

    Many profiler can do that.
    My profiler, jmp, is free (GPL) and can be found at http://www.khelekore.org/jmp/
    you can start with very little profiling and then enable memory tracing after a while to inspect memory use (or write a file with the info) and then disable memoory tracing again.
    If you like to spend money you can always try optimizeit, jprobe or jprofiler, some of them may even have 30 day trial versions.
    Profilers for memory normally use the jvmpi.

  • Finding Objects in JVM

    Hi,
    Is there a way by which I can get a reference to any object in JVM?
    OR
    Is there way I can get reference to all the active object instances that are currently available in the JVM ?
    OR
    Is there a way I can get a reference of all the objects active of a given class in JVM?
    For Example :
    class A {
    static void main(String args[])
    String str = new String("Test");
    class FindAObject {
    static void main(String args[])
    String strObjFound = (String) getReferenceOfObject("str");
    Object getReference(String objName)
    /*Steps/API call to get reference to "str" object of Class A*/;
    Here I am assuming that both the classes A and FindObject are active in JVM at a given time. Its really not important to find object by name ... Any other way to find objects will do.
    In one of the threads on one of the forums, I read that analyzing how various Garbage Collectors work can help ... but could not get my hands on any GC implementation.
    Thanks,
    Vinayak

    Is there a way by which I can get a reference to any object in JVM? You need to have a reference to it or something which has a reference to it etc.
    Is there way I can get reference to all the active object instances that are currently available in the JVM ?No.
    Is there a way I can get a reference of all the objects active of a given class in JVM?No. You can keep this list if you need it however.
    It sounds like what you need is either a debugger or a profiler.

  • How to convert from Finder Object reference to POSIX path

    I'm new to AppleScript. I'm super close to getting what I need done, but I've ran across a snag in the middle.
    The error I'm getting is Can’t make quoted form of POSIX path of item 1 of {«class docf» \"filename\" of «class cfol» \"foldername\" of «class cfol» \"Desktop\" of «class cfol» \"Username\" of «class cfol» \"Users\" of «class sdsk» of application \"Finder\"} into type Unicode text. the problem area is highlighted and notated below. I've looked all around online but can't find what I need.
    Thanks in advance for any and all help!
    set text item delimiters to "."
    tell application "Finder"
      set theFilestoChoose to every item of (choose file with prompt "Please select the file(s) you would like to move and rename" with multiple selections allowed) as list
      display dialog "Would you like to move these files to an existing folder and then rename them, or create a new folder and then rename them?" buttons {"Move to an existing folder and rename", "Create a new folder and rename"}
      if result = {button returned:"Move to an existing folder and rename"} then
      set firstnewname to "Aauuttoommaattoorr"
      repeat with index from 1 to the count of theFilestoChoose
      set theFilesChosenbeingrenamedfirsttime to item index of theFilestoChoose
      set filenamecount to text items of (get name of theFilesChosenbeingrenamedfirsttime)
      if number of filenamecount is 1 then
      set fileextension to ""
      else
      set fileextension to "." & item -1 of filenamecount
      end if
      set the name of theFilesChosenbeingrenamedfirsttime to firstnewname & index & fileextension as string
      end repeat
      log theFilesChosenbeingrenamedfirsttime
      set choosingtheplacetomove to choose folder with prompt "Select the folder to move to"
      set thechosenfoldersname to name of folder choosingtheplacetomove -- sets the folder name as text
      set AppleScript's text item delimiters to {"-"}
      set Numberofthemonthatthebeginningofthefoldername to text item 1 of thechosenfoldersname as string -- for later to append the number back on without having to ask again!
      set shortenedname to text item 2 of thechosenfoldersname as string
      set the name of choosingtheplacetomove to shortenedname as string
      set thefolderstemporarynameaslocation to choosingtheplacetomove as string
      move theFilestoChoose to folder thefolderstemporarynameaslocation
      log theFilestoChoose
      set allfilesindestinationfolder to every file in choosingtheplacetomove as alias list --
      set aInitials to the text returned of (display dialog "Whose camera were this/these pictures taken on?" default answer "")
      set filteredList to my filterList(allfilesindestinationfolder, aInitials) as list
      log filteredList
      -- everything above this is correct so far and works perfect
      --TROUBLE SECTION BELOW
      set theSortedfilterList to (sort filteredList by creation date) -- something happens here with the theSortedfilterList that makes it unintelligible to convert to POSIX later. but I need the files in the order that this line puts them.
      log theSortedfilterList
      set timetorenamelasttime to theSortedfilterList
      set newbasename to shortenedname
      repeat with index from 1 to the count of timetorenamelasttime
      set theonefile to item index of timetorenamelasttime
      set theonefilenamecount to text items of (get name of theonetwothreefile)
      if number of theonefilenamecount is 1 then
      set fileextensionone to ""
      else
      set fileextensionone to "." & item -1 of theonefilenamecount
      end if
      tell application "System Events" to set CreaDate to creation date of file theonefile
      set CreaDate2 to CreaDate as text -- need to trim down to the first 10 characters and eliminate the "-"
      set AppleScript's text item delimiters to {""}
      set shorteneddatename to text items 1 thru 10 of CreaDate2 as string
      set the name of theonefile to shorteneddatename & {"-"} & newbasename & {"-"} & aInitials & {"-"} & index & fileextensionone as string
      end repeat
      --Trouble section above
      set the name of choosingtheplacetomove to Numberofthemonthatthebeginningofthefoldername & "-" & shortenedname as string -- returns the month prefix to the foldername
      else if result = {button returned:"Create a new folder and rename"} then
      set repeatConfirmation to true --Boolean to decided if script should be repeated; default is to repeat
      repeat while (repeatConfirmation = true) --Repeat if Any Tests Are Failed
      set thefirstquestion to choose from list {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"} with title "Event Month Selection" with prompt "Select the month in which the event started. Select only one month:"
      set theMonthAnswer to result
      if theMonthAnswer = false then --"For historical reasons, choose from list is the only dialog command that returns a result (false) instead of signaling an error when the user presses the “Cancel” button."
      set repeatConfirmation to false
      set exitingeventmonth to display dialog ("You are exiting selecting the event month phase of the program. You will need to manually fix this decision") buttons {"OK"} with title "Exiting Event Month Selection"
      if button returned of exitingeventmonth = "OK" then
      set theMonthAnswer to ""
      end if
      else
      set confirmationanswer to display dialog "You selected " & theMonthAnswer & ", is this correct? " buttons {"Yes, that's correct.", "No, the picture(s) are from a different month."} with title "Confirm Event Month Selection"
      if button returned of confirmationanswer = "Yes, that's correct." then
      set repeatConfirmation to false
      else
      display dialog ("That's okay, you can select another again!") buttons {"OK"} with title "Return to Event Month Selection"
      end if
      end if
      end repeat
      log theMonthAnswer
      if theMonthAnswer = "" then
      set monthtonumber to "You have cancelled this action."
      log monthtonumber
      else if theMonthAnswer = {"January"} then
      set monthtonumber to "01"
      log monthtonumber
      else if theMonthAnswer = {"February"} then
      set monthtonumber to "02"
      log monthtonumber
      else if theMonthAnswer = {"March"} then
      set monthtonumber to "03"
      log monthtonumber
      else if theMonthAnswer = {"April"} then
      set monthtonumber to "04"
      log monthtonumber
      else if theMonthAnswer = {"May"} then
      set monthtonumber to "05"
      log monthtonumber
      else if theMonthAnswer = {"June"} then
      set monthtonumber to "06"
      log monthtonumber
      else if theMonthAnswer = {"July"} then
      set monthtonumber to "07"
      log monthtonumber
      else if theMonthAnswer = {"August"} then
      set monthtonumber to "08"
      log monthtonumber
      else if theMonthAnswer = {"September"} then
      set monthtonumber to "09"
      log monthtonumber
      else if theMonthAnswer = {"October"} then
      set monthtonumber to "10"
      log monthtonumber
      else if theMonthAnswer = {"November"} then
      set monthtonumber to "11"
      log monthtonumber
      else if theMonthAnswer = {"December"} then
      set monthtonumber to "12"
      log monthtonumber
      end if
      set theNameofFoldertoMake to text returned of (display dialog "Please enter the name of the new folder you are creating:" default answer "" with title "New Folder Name")
      set LocationOfNewFolder to choose folder with prompt "Choose the location of the new folder you are creating:"
      set theNewNameofFoldertoMake to monthtonumber & "-" & theNameofFoldertoMake
      set newfolderaction to make new folder at LocationOfNewFolder with properties {name:theNewNameofFoldertoMake}
      move theFilestoChoose to newfolderaction
      end if
    end tell
    --function
    on filterList(allfilesindestinationfolder, aInitials)
      set patterns to {aInitials as string, "Aauuttoommaattoorr"}
      set output to {}
      repeat with aFile in the allfilesindestinationfolder
      repeat with aPattern in patterns
      set filepath to aFile as string
      if filepath contains aPattern then
      set end of the output to aFile
      exit repeat
      end if
      end repeat
      end repeat
      return output
    end filterList

    Okay, so you wanted the debugging and error messages. Thank you for the coaching. Here is what I get from the following line:
    set theSortedfilterList to (sort filteredList by creation date)
    log theSortedfilterList
    Log returns:
    (*document file Aauuttoommaattoorr3.AVI of folder SnowDay of folder Desktop of folder Username of folder Users of startup disk, document file Aauuttoommaattoorr2.MOV of folder SnowDay of folder Desktop of folder Username of folder Users of startup disk, document file Aauuttoommaattoorr1.mov of folder SnowDay of folder Desktop of folder Username of folder Users of startup disk*)
    set pxFile to POSIX path of ((theSortedfilterList) as alias)
    Error: "Can’t make {«class docf» \"Aauuttoommaattoorr3.AVI\" of «class cfol» \"SnowDay\" of «class cfol» \"Desktop\" of «class cfol» \"Username\" of «class cfol» \"Users\" of «class sdsk» of application \"Finder\", «class docf» \"Aauuttoommaattoorr2.MOV\" of «class cfol» \"SnowDay\" of «class cfol» \"Desktop\" of «class cfol» \" Username \" of «class cfol» \"Users\" of «class sdsk» of application \"Finder\", «class docf» \"Aauuttoommaattoorr1.mov\" of «class cfol» \"SnowDay\" of «class cfol» \"Desktop\" of «class cfol» \" Username \" of «class cfol» \"Users\" of «class sdsk» of application \"Finder\"} into type alias." number -1700 from {«class docf» "Aauuttoommaattoorr3.AVI" of «class cfol» "SnowDay" of «class cfol» "Desktop" of «class cfol» "Username" of «class cfol» "Users" of «class sdsk», «class docf» "Aauuttoommaattoorr2.MOV" of «class cfol» "SnowDay" of «class cfol» "Desktop" of «class cfol» "Username" of «class cfol» "Users" of «class sdsk», «class docf» "Aauuttoommaattoorr1.mov" of «class cfol» "SnowDay" of «class cfol» "Desktop" of «class cfol» "Username" of «class cfol» "Users" of «class sdsk»} to alias
    That is why I labeled it with Finder Object reference won’t return POSIX path, because I tried what was suggested about using the POSIX path of line. I thought seeing the lines above and around it would help set the context.
    So I need those files, but I need them sorted by creation date so that they’re in that order for the next renaming step.

  • How do I find out how much memory can my macbook upgraded?

    How do I find out how much memory can my macbook upgraded?

    You can use either Everymac http://www.everymac.com/ or the freeware MacTracker http://www.mactracker.ca/
    to get the info if you don't want to share the specs of your MacBook here.
    Regards
    Stefan

  • How do I find out the exact path of each and every file that LabVIEW finds and loads into memory for a given top level vi?

    How do I find out the exact path of each and every file that LabVIEW finds and loads into memory for a given top level vi? There is probably a trivial, easy way to get this info, but I have not yet found it!  Thanks..

    Or if you want to grab all the paths programatically, try the attached VI.
    Open the top level that you want all the paths from and close all others, then open the
    attached and run it. It will return an array of all the VIs that the VI
    in question uses, including vi.lib VIs. You can filter these as well if
    you like.
    Ed
    Message Edited by Ed Dickens on 08-01-2005 07:01 PM
    Ed Dickens - Certified LabVIEW Architect - DISTek Integration, Inc. - NI Certified Alliance Partner
    Using the Abort button to stop your VI is like using a tree to stop your car. It works, but there may be consequences.
    Attachments:
    Get all paths.vi ‏29 KB

  • Issue in finding the current row

    I am rendering rows of a VO using an iterator component. One of the component I am rendering is a declarative component created by me.
    In this component there is a clickable link on which i can write any method to achieve desired functionality.
    Since, iterator is used so the current row is set to the last row. Now on clicking the link in the declarative component i need to do some operation based on the current row (pk of that row). So, how to find the current row id?
    Note: If it would be a simple adf component like a commandLink i could have inserted a setServerListener inside it and could have put the id in to requestScope to access it. But as this is the declarative component in which i cannot create a serverListener so I am looking for some other solution.

    Hi john,
    My table have the selection listener.
    Thanks in advance

  • Need help for finding objects impacted by size change for an infoobject

    hi all,
    need help for finding objects impacted by size change
    for xxx infoobject, due to some requirements, the size to be changed from
    char(4) to char(10), in the source database tables as well as adjustment
    to be done in BI side.
    this infoobject xxx is nav attribute of YYY as well as for WWW
    infoobjects. and xxx is loaded from infopkg for www infoobject load.
    now that i have to prepare an impact analysis doc for BI side.
    pls help me with what all could be impacted and what to be done as a
    solution to implement the size change.
    FYI:
    where used list for xxx infoobject - relveals these object types :
    infocubes,
    infosources,
    tranfer rules,
    DSO.
    attribute of characteristic,
    nav attribute,
    ref infoobject,
    in queries,
    in variables

    Hi Swetha,
    You will have to manually make the table adjustments in all the systems using SE14 trans since the changes done using SE14 cannot be collected in any TR.
    How to adjust tables :
    Enter the table name in SE14. For ex for any Z master data(Say ZABCD), master data table name would be /BIC/PZABCD, text table would be /BIC/TZABCD. Similarly any DSO(say ZXYZ) table name would be /BIC/AZXYZ00 etc.
    Just enter the table name in SE14 trans --> Edit --> Select the radio button "Save Data" --> Click on Activate & adjust database table.
    NOTE : Be very careful in using SE14 trans since there is possibility that the backend table could be deleted.
    How to collect the changes in TR:
    You can collect only the changes made to the IO --> When you activate, it will ask you for the TR --> Enter the correct package name & create a new TR. If it doesn't prompt you for TR, just goto Extras --> Write transport request from the IO properties Menu screen. Once these IO changes are moved successfully, then the above proceduce can be followed using SE14 trans.
    Hope it helps!
    Regards,
    Pavan

  • How to Find the Current Instance Id in Oracle 10g

    Hi,
    how to find the current instance id in oracle 10g studio,
    I have the below code :
    if (InstanceScreenFlow.processInstance.id.id.indexOf(text : ins.id) < 0) {
    /// do something
    it is saying that "'processInstance' is not a function"
    Thanks,
    Brijesh Kumar Singh.

    Why not just pass in the "id" predefined variable into your screenflow? Once you do that you'll be able to refer to it as "id.id" anywhere inside your screenflow.
    Dan

  • How to find the current SQL

    Dear All,
    My testing engineers are checking the application from front end, i have to find the current SQL (What SQL queries are used in the application) statements in the back end.
    Please let me know how to find the current executing SQL stements.
    Thanks in advance
    Mahi

    You need to join this query with one more table - v$sqlstats. There are many statistics in particular cpu_time, elapsed_time etc stored in that table for each sql statement.
    You can join v$sqlstats by sql_id until you have multiple child cursors for single statement.
    Or you can just join to v$sql and get statistics from there and in this latter case you include child_number column to distinguish child cursors from each other.
    Best Regards,
    Alex

  • 3D Picture Control: Find Object function closes scene reference when it has no children

    I am using Labview 8.2
    The "Find Object.vi" function is causing me some problems as it is closing the reference to the Scene Object passed into it when that Scene object does not contain any child objects.  The attached screengrab shows the relevant part of the "Find Object.vi" function - the input (parent) reference is added to the front of the queue, and if the "ObjectCount" method returns 0, then the reference is closed (and hence unavailable from that point on.  By removing the "Close Reference" function, the reference remains valid, but I am unsure of what other consequences this would have (and I don't like editing NI VI's!).
    I have attached an example VI to illustrate this, hopefully it is clear enough what is happening.  Basically, I want to be able to check for the existence of a child object without risking losing the parent object's reference.  I could always write my own but perhaps the "Find Object.vi" function is incorrect?
    Attachments:
    Find Object Testing.vi ‏30 KB
    Find Object_closingreference.png ‏5 KB

    pauldavey,
    I agree with you again that the behavior of "Find Object.vi" does not appear to be optimal.  It is almost as if it should be called "Select Object.vi" as it doesn't appear to be handling the case in which no objects are found very well.
    The help file states that it:
    Takes a 3D scene reference
    and an object name and returns the first object in the scene with a matching
    name.
    As it's behavior is not defined for the event that a matching object is not found I would recommend writing your own VI to perform the function you need.
    I plan on looking a little further into this and I may end up filing a CAR for this behavior too.
    We appreciate the feedback and I apologize for the difficulties this VI is causing you.
    Regards,
    Simon H
    Applications Engineer
    National Instruments

Maybe you are looking for

  • Error when burning DVD

    I just bought a Mac a few weeks ago, and have had some trouble burning DVD's. I have a G5 running 10.3.9, with a Pioneer Superdrive. I try to burn an image in Disk Utility, but get the error message "The disc is reserved for exclusive use by another

  • Autofill problem, Please Help!!

    I recently had to purchase a new MacBook Pro. Never had this problem before. My personal email starts with PS. I have a contract that everything starts with PS and each time I type this letter combo it autofills my email address. Sometimes a bubble a

  • Not able to resize my objects in Nested iview

    Dear all, This is how I created my dashboard. Model -> iview -> Layers(tabs) -> Each layer has various forms, queries and charts. Now I have changed it to Model -> iview -> Layers(tabs) -> Nested iview-> Each Nested iview has various forms, queries a

  • Transferring After Effects CS4 Project to a different computer

    I have basically contructed a project in After Effects CS4, but unfortunately, my computer is quite poor and crashes during rendering. So I was wondering if there is a way for me to transfer the entire project to a different computer with After Effec

  • Unable to install iOS 5 on iPad 1. I get "This version of the iPad software (4.2) is the current version."

    I have also tried to manually upgrade but then I get the following error message: The iPad "iPad" could not be upgraded. An unknown error occurred (3002). (I have followed the explanation here on the 3002 error but that does not make any sense.) I ha