; -------------------------------------------------------------------------------- ; @Title: Menu File for TRACE32 QNX Awareness ; @Description: - ; @Keywords: QNX menu awareness ; @Author: DIE ; @Copyright: (c) 1989-2022 Lauterbach GmbH, licensed for use with TRACE32(R) only ; -------------------------------------------------------------------------------- ; $Id: qnx.m 9317 2023-08-02 14:44:51Z rdienstbeck $ NAME "TASK.QNX" IF !MENU.EXIST("TASK.QNX") ( add menu ( popup "QNX" ( default menuitem "Display &Processes" "TASK.Process" menuitem "Display &Threads" "TASK.Thread" popup "Display pidin-like" ( menuitem "plain" "TASK.PIDIN" menuitem "flags" "TASK.PIDIN FLags" menuitem "family" "TASK.PIDIN FAm" menuitem "procmem" "TASK.PIDIN PMEM" menuitem "memory" "TASK.PIDIN MEM" ) menuitem "Display &ASInfo" "TASK.ASINFO" popup "Display File System" ( menuitem "Display IFS directory" "TASK.IFS" menuitem "Display shmem contents..." ( dialog ( header "TASK.SHMEM" pos 0. 0. 24. 3. box "shmem file path" pos 1. 1. 22. 1. shmem: defedit "" "" pos 2. 3. 7. 1. defbutton "Ok" ( PRIVATE &shmem &shmem=dialog.string(shmem) TASK.SHMEM "&shmem" dialog.end ) pos 15. 3. 7. 1. button "Cancel" "dialog.end" ) ) menuitem "Display slogger2 contents..." ( dialog ( header "TASK.SLOGGER2" pos 0. 0. 24. 3. box "slogger2 buffer name" pos 1. 1. 22. 1. slogger2: defedit "" "" pos 2. 3. 7. 1. defbutton "Ok" ( PRIVATE &slogger2 &slogger2=dialog.string(slogger2) TASK.SLOGGER2 "&slogger2" dialog.end ) pos 15. 3. 7. 1. button "Cancel" "dialog.end" ) ) ) separator popup "&Process Debugging" ( menuitem "[:symbols]&Load Symbols..." ( dialog ( header "TASK.sYmbol.LOAD" pos 0. 0. 30. 3. box "Process name" pos 1. 1. 20. 1. procl: defedit "" "" pos 6. 3. 7. 1. defbutton "Ok" ( PRIVATE &procl &procl=dialog.string(procl) TASK.sYmbol.LOAD "&procl" dialog.end ) pos 17. 3. 7. 1. button "Cancel" "DIALOG.END" ) ) menuitem "[:symbols]&Delete Symbols..." ( dialog ( header "TASK.sYmbol.DELete" pos 0. 0. 30. 3. box "Process name" pos 1. 1. 20. 1. procd: defedit "" "" pos 6. 3. 7. 1. defbutton "Ok" ( PRIVATE &procd &procd=dialog.string(procd) TASK.sYmbol.DELete "&procd" dialog.end ) pos 17. 3. 7. 1. button "Cancel" "dialog.end" ) ) menuitem "Debug New Process..." ( PRIVATE &sPath &sOptionMachineName IF (PRACTICE.FUNCtion.AVAILable(SYStem.Option.MACHINESPACES)) ( IF (SYStem.Option.MACHINESPACES()&&(""!="")) ( SPRINTF &sOptionMachineName "/MACHINE %s" STRing.SPLIT("",".",0.) ) ) &sPath=OS.FILE.JOINPATH(TASK.GETDIR(),"app_debug.cmm") IF OS.FILE("&sPath") ( DO "&sPath" /DIALOG &sOptionMachineName ENDDO ) PRINT %ERROR "File ""app_debug.cmm"" not found. Please contact support@lauterbach.com ." ) addhere popup "&Watch Processes" ( menuitem "[:plus]&Add..." ( dialog ( header "Add Process to Watch" pos 0. 0. 24. 3. box "Process name" pos 1. 1. 22. 1. wproca: defedit "" "" pos 2. 3. 7. 1. defbutton "Ok" ( PRIVATE &wproca &wproca=dialog.string(wproca) TASK.Watch.View "&wproca" dialog.end ) pos 15. 3. 7. 1. button "Cancel" "dialog.end" ) ) menuitem "[:remove]&Remove..." ( dialog ( header "Delete Process from Watch" pos 0. 0. 24. 3. box "Process name" pos 1. 1. 22. 1. wprocd: defedit "" "" pos 2. 3. 7. 1. defbutton "Ok" ( PRIVATE &wprocd &wprocd=dialog.string(wprocd) TASK.Watch.DELete "&wprocd" dialog.end ) pos 15. 3. 7. 1. button "Cancel" "dialog.end" ) ) ) separator menuitem "[:mmu]Scan Process MMU Pages..." ( dialog ( header "MMU.TaskPageTable.SCAN" pos 0. 0. 24. 3. box "Process name" pos 1. 1. 22. 1. wproca: defedit "" "" pos 2. 3. 7. 1. defbutton "Ok" ( PRIVATE &wproca &wproca=dialog.string(wproca) MMU.TaskPageTable.SCAN "&wproca" dialog.end ) pos 15. 3. 7. 1. button "Cancel" "dialog.end" ) ) menuitem "[:mmu]Scan All MMU Tables" "MMU.SCANALL" separator menuitem "[:manual]Help Process Debugging" "HELP __RTOS_QNX_.LINK.User_Processes" ) popup "&Library Debugging" ( menuitem "[:symbols]&Load Symbols..." ( dialog ( header "TASK.sYmbol.LOADLib" pos 0. 0. 22. 3. box "Process name" pos 1. 1. 20. 1. libpl: defedit "" "" pos 0. 3. 22. 3. box "Library name" pos 1. 4. 20. 1. libll: defedit "" "" pos 6. 6. 7. 1. defbutton "Ok" ( PRIVATE &libpl &libll &libpl=dialog.string(libpl) &libll=dialog.string(libll) TASK.sYmbol.LOADLib "&libpl" "&libll" dialog.end ) pos 17. 6. 7. 1. button "Cancel" "dialog.end" ) ) menuitem "[:symbols]&Delete Symbols..." ( dialog ( header "TASK.sYmbol.DELeteLib" pos 0. 0. 22. 3. box "Process name" pos 1. 1. 20. 1. libpd: defedit "" "" pos 0. 3. 22. 3. box "Library name" pos 1. 4. 20. 1. libld: defedit "" "" pos 6. 6. 7. 1. defbutton "Ok" ( PRIVATE &libpd &libld &libpd=dialog.string(libpd) &libld=dialog.string(libld) TASK.sYmbol.DELeteLib "&libpd" "&libld" dialog.end ) pos 17. 6. 7. 1. button "Cancel" "dialog.end" ) ) separator menuitem "Scan Process MMU Pages..." ( dialog ( header "MMU.TaskPageTable.SCAN" pos 0. 0. 24. 3. box "Process name" pos 1. 1. 22. 1. wproca: defedit "" "" pos 2. 3. 7. 1. defbutton "Ok" ( PRIVATE &wproca &wproca=dialog.string(wproca) MMU.TaskPageTable.SCAN "&wproca" dialog.end ) pos 15. 3. 7. 1. button "Cancel" "dialog.end" ) ) menuitem "Scan All MMU Tables" "MMU.SCANALL" ) separator popup "S&ymbol Autoloader" ( menuitem "[:symbols]List Components" "sYmbol.AutoLoad.List" menuitem "[:init]Check Now!" "sYmbol.AutoLoad.CHECK" menuitem "[:config]Config..." "sYmbol.AutoLOAD.config" menuitem "[:objects]Components..." ( dialog ( header "TASK.sYmbol.Option AutoLoad" pos 0. 0. 25. proc: checkbox "Process (Processes)" ( if dialog.boolean(proc) TASK.sYmbol.Option AutoLoad Process else TASK.sYmbol.Option AutoLoad NoProcess ) lib: checkbox "Library (All Libraries)" ( if dialog.boolean(lib) TASK.sYmbol.Option AutoLoad Library else TASK.sYmbol.Option AutoLoad NoLibrary dialog.set clib "FALSE" ) clib: checkbox "CurrLib (Libraries of Current Process)" ( if dialog.boolean(clib) TASK.sYmbol.Option AutoLoad CurrLib else TASK.sYmbol.Option AutoLoad NoLibrary dialog.set lib "FALSE" ) ) dialog.set proc ((TASK.y.o(autoload)&0x1)!=0) dialog.set lib ((TASK.y.o(autoload)&0x2)!=0) dialog.set clib ((TASK.y.o(autoload)&0x8)!=0) ) ) IF PRACTICE.FUNCtion.AVAILable(SYStem.Option.MACHINESPACES) ( IF !SYStem.Option.MACHINESPACES() ( MENUITEM "[ X X X X X,XXXXXXXXXXXX, XxxxxxxxxXs,XXxxxxxxxxXs, XxxxxxxxxXX,XXxxxxxxxxXs, XxxxxxxxxXX,XXxxxxSSSSSSSS, XxxxxSBBwwwwwS,XXxxxxSBBwwwXwBS, XXXXXSBBwwwwwBB, XsXsXSBBBBBBBBB, SBBWWWWWBB, SBBWWWWWBB, SBBWRRRWBB, BBWWWWWBB]Generate RAM Dump" ( PRIVATE &sPath &sPath=OS.FILE.JOINPATH(TASK.GETDIR(),"ramdump.cmm") IF OS.FILE("&sPath") ( DO "&sPath" /DIALOG ENDDO ) PRINT %ERROR "File ""ramdump.cmm"" not found. Please contact support@lauterbach.com ." ) ) ) ELSE ( MENUITEM "[ X X X X X,XXXXXXXXXXXX, XxxxxxxxxXs,XXxxxxxxxxXs, XxxxxxxxxXX,XXxxxxxxxxXs, XxxxxxxxxXX,XXxxxxSSSSSSSS, XxxxxSBBwwwwwS,XXxxxxSBBwwwXwBS, XXXXXSBBwwwwwBB, XsXsXSBBBBBBBBB, SBBWWWWWBB, SBBWWWWWBB, SBBWRRRWBB, BBWWWWWBB]Generate RAM Dump" ( PRIVATE &sPath &sPath=OS.FILE.JOINPATH(TASK.GETDIR(),"ramdump.cmm") IF OS.FILE("&sPath") ( DO "&sPath" /DIALOG ENDDO ) PRINT %ERROR "File ""ramdump.cmm"" not found. Please contact support@lauterbach.com ." ) ) separator popup "&Stack Coverage" ( menuitem "&List Stacks" ( if icd() TASK.STacK.PATtern 0 TASK.STacK ) menuitem "Add Task" "TASK.STacK.ADD" menuitem "Remove Task" "TASK.STacK.ReMove" menuitem "Reset Coverage" ( PRIVATE &yes DIALOG.YESNO "Overwrite unused stack space" "with stack fill pattern?" ENTRY &yes IF !&yes ENDDO TASK.STacK.Init ) ) ) popup "Trace" ( popup "List" ( separator menuitem "&Task Switches" "Trace.List List.TASK" menuitem "&Default and Tasks" "Trace.List List.TASK DEFault" ) ) popup "Perf" ( separator popup "&Task Runtime" ( menuitem "&Prepare" ( if t.method.analyzer() ( Analyzer.AutoInit on ) if a.mode.flow() ( Break.Delete /TraceEnable Break.Set TASK.config(magic) /TraceEnable ) ) menuitem "[:perf]Show &Numerical" "Trace.STATistic.TASK" menuitem "[:achart]Show as &Timing" "Trace.CHART.TASK" menuitem "[:achart]Tracking with Trace &List" ( Trace.List List.TASK DEFault /Track Trace.CHART.TASK /Track ) ) popup "Task &Function Runtime" ( menuitem "&Prepare" ( if t.method.analyzer() ( Analyzer.AutoInit on Analyzer.STATistic.PreFetch on ) if a.mode.flow() ( Break.Delete /TraceData Break.Set task.config(magic) /TraceData ) ) menuitem "[:perf]Show &Numerical" "Trace.STATistic.TASKFUNC" menuitem "[:perf]Show as &Tree" "Trace.STATistic.TASKTREE" menuitem "[:perf]Show &Detailed Tree" "Trace.STATistic.TASKTREE ALL" menuitem "[:achart]Show as &Timing" "Trace.CHART.TASKFUNC" menuitem "[:alist]Show N&esting" "Trace.List List.TASK FUNC TI.FUNC" ) popup "Task &Status" ( menuitem "&Prepare" ( if t.method.analyzer() ( Analyzer.AutoInit on ) ) menuitem "[:perf]Show &Numerical" "Trace.STATistic.TASKSTATE" menuitem "[:achart]Show as &Timing" "Trace.CHART.TASKSTATE" menuitem "[:achart]Tracking with Trace &List" ( Trace.List List.TASK DEFault /Track Trace.CHART.TASKSTATE /Track ) ) ) popup "&Help" ( MENUITEM "[:manual]OS Awareness Manual QNX" "HELP __RTOS_QNX_" ) ) menu "task.p" ( default menuitem "Display detailed" ( PRIVATE &address &address=address.offset(track.address()) TASK.Process &address ) menuitem "Display Process struct" ( PRIVATE &address &address=track.address() Var.View %Open %String (struct process_entry*)(&address) ) separator menuitem "Load Process Symbols" "TASK.sYmbol.LOAD track.address()" menuitem "Delete Process Symbols" "TASK.sYmbol.DELete track.address()" menuitem "Add to Watched Processes" ( PRIVATE &address &address=address.offset(track.address()) TASK.Watch.View &address ) menuitem "Delete from Watched Processes" "TASK.Watch.DELete track.address()" separator menuitem "Scan MMU Pages" ( PRIVATE &address &address=address.offset(track.address()) &address=TASK.proc.threads(&address,0) MMU.TaskPageTable.SCAN &address ) menuitem "Dump process entry" ( PRIVATE &address &address=track.address() Data.dump &address /l /dialog ) ) menu "task.t" ( default menuitem "Display Detailed" ( PRIVATE &thread &thread=address.offset(track.address()) TASK.Thread &thread ) IF TASK.MUON.AVAIL()!=0 ( menuitem "Display Thread struct" ( PRIVATE &address &address=address.offset(track.address()) &access=address.straccess(track.address()) &address=TASK.MUON.THREAD(&address) Var.View %Open %String (struct thread_entry*)(&(access)&(address)) ) menuitem "Display Muon Thread struct" ( PRIVATE &address &address=track.address() Var.View %Open %String (muon_thread_t*)(&address) ) ) ELSE ( menuitem "Display Thread struct" ( PRIVATE &address &address=track.address() Var.View %Open %String (struct thread_entry*)(&address) ) ) separator menuitem "Display Stack Frame" ( PRIVATE &thread &thread=address.offset(track.address()) Var.Frame /Locals /Caller /TASK &thread ) menuitem "Switch Context" ( PRIVATE &thread &thread=address.offset(track.address()) Register.TASK &thread ) separator menuitem "Add to Stack Cov" ( PRIVATE &thread &thread=address.offset(track.address()) TASK.STacK.ADD &thread ) menuitem "Rm from Stack Cov" ( PRIVATE &thread &thread=address.offset(track.address()) TASK.STacK.ReMove &thread ) separator menuitem "Dump thread entry" ( PRIVATE &address &address=track.address() Data.dump &address /DIALOG ) ) menu "task.lib" ( default ;menuitem "Display detailed" ;( ; &address=address.offset(track.address()) ; TASK.LIBrary &address ;) menuitem "Display Library struct" ( PRIVATE &address &address=address.offset(track.address()) Var.View %m %s (struct link_map*)&address ) separator menuitem "Load Library Symbols" "TASK.sYmbol.LOADLib track.string() track.address()" menuitem "Delete Library Symbols" "TASK.sYmbol.DELeteLib track.string() track.address()" separator menuitem "Dump Library entry" ( PRIVATE &address &address=address.offset(track.address()) Data.dump &address /l /dialog ) ) menu "task.w" ( default menuitem "Display Process" ( PRIVATE &address &address=address.offset(track.address()) TASK.Process &address ) menuitem "Delete from List" ( PRIVATE &name &name=track.string() TASK.Watch.DELete "&name" ) ) buttons "y.aload.l" ( width wider menuitem "[:objects]Components..." ( dialog ( header "TASK.sYmbol.Option AutoLoad" pos 0. 0. 25. proc: checkbox "Process (Processes)" ( if dialog.boolean(proc) TASK.sYmbol.Option AutoLoad Process else TASK.sYmbol.Option AutoLoad NoProcess ) lib: checkbox "Library (All Libraries)" ( if dialog.boolean(lib) TASK.sYmbol.Option AutoLoad Library else TASK.sYmbol.Option AutoLoad NoLibrary dialog.set clib "FALSE" ) clib: checkbox "CurrLib (Libraries of Current Process)" ( if dialog.boolean(clib) TASK.sYmbol.Option AutoLoad CurrLib else TASK.sYmbol.Option AutoLoad NoLibrary dialog.set lib "FALSE" ) ) dialog.set proc ((TASK.y.o(autoload)&0x1)!=0) dialog.set lib ((TASK.y.o(autoload)&0x2)!=0) dialog.set clib ((TASK.y.o(autoload)&0x8)!=0) ) ) )