[Gambas-user] tracking down toolkit erors

Brian G brian at westwoodsvcs.com
Tue Aug 10 15:49:38 CEST 2021


Hi Bruce. 
That idea just came to me last night .. seems to work.
Sorry 
--
Thanks
Brian G Monday, 09 August 2021, 11:46PM -07:00 from Brian G  brian at westwoodsvcs.com :

>Bruce, 
>If you make the following change your errors will go to the console
>and all underlying C code errors will go to the pipe. No need for filters in the
>File_read function. probably a good idea to log them in case anything really
>does go wrong.
>If you don't want to capture those errors at all then just make writer open as "/dev/null"
>skip the whole open for read.
>
>"Failure is the key to success; 
> each mistake teaches us something"  .. Morihei Ueshiba
>Brian G
>
>----- On Aug 9, 2021, at 7:41 AM, Bruce Steers < bsteers4 at gmail.com> wrote:
>>Many Thanks BrianG.  With this and your other help I now have this routine....
>>
>>' Gambas class file
>>
>>Extern dup2(OldFD As Integer, newfd As Integer) In "libc:6"
>>Private Writer As File
>>Private Reader As File
>>Private restore As File
>>
>>Public Sub _new()
>>  Writer = Open Pipe "/tmp/testpipeout" For Write
>>  restore = File.Err
>>  dup2(Writer.handle, 2)
>>  Reader = Open Pipe "/tmp/testpipeout" For Read Watch
>>End
>Public Sub _new()
>  Writer = Open Pipe "/tmp/testpipeout" For Write
>  
>' get the error destination to a known handle
>  restore = Open "/dev/null" For Write                 ' open any old file to get a handle
>  dup2(2, restore.handle)                                     ' Make that handle equal std error
>  Error To restore                                                  ' point gambas's error output to the original term 
>  
>  dup2(Writer.handle, 2)
>  Reader = Open Pipe "/tmp/testpipeout" For Read Watch
> 
>End
>
>Alternatively if not wanting to capture the other libc errors then just:
>
>Public Sub _new()
>  Writer = Open Pipe "/dev/null" For Write
>  
>' get the error destination to a known handle
>  restore = Open "/dev/null" For Write                 ' open any old file to get handle
>  dup2(2, restore.handle)                                     ' Make that handle equal std error
>  Error To restore                                                  ' point gambas's error output to the original term 
>  
>  dup2(Writer.handle, 2)                                       ' All other outputs to null don't need file_read at all
> 
>End
>
>>
>>
>>Public Sub File_read()
>>
>>  Dim buffer As String
>>
>>  buffer = Read #Last, -Lof(Last)
>>  For Each sLine As String In Split(buffer, "\n")
>>    If Not sLine Then Continue
>>    If sLine Like "(" & Application.Name & ":*): G*k-*" Then Continue 
>>    Print sLine
>>  Next
>>
>>End 
>Public Sub File_read()
>  Dim buffer As String
>  buffer = Read #Last, -Lof(Last)
>  '' write to some logfile here maybe
>End
>
>>
>>
>>Public Sub Form_Close()
>>  If Writer Then Writer.Close()
>>  If Reader Then Reader.Close()
>>  dup2(restore.handle, 2)
>>End
>>
>>
>>Public Sub Button1_Click()
>>
>>  Print "Print Something"
>>  Debug "Debug Something"
>   Error "something"
>>
>>
>>End
>>I had to check each line of the buffer individually and used Like to pattern-match the Gtk- Gdk- messages
>>
>>So with that code my own Debug and Error messages still output (albeit to stdout but that's fine) just the gtk/gdk messages are gone :)
>>Thanks again Brian , much respect :)
>>BruceS
>>
>>
>>
>>On Sun, 8 Aug 2021 at 03:34, Brian G < brian at westwoodsvcs.com> wrote:
>>>Bruce replace your _new with this code
>>>Extern dup2(OldFD As Integer, newfd As Integer) In "libc:6"
>>>Static Dummy As File
>>>Static Public Sub _init()
>>>  dummy = Open "/dev/null" For Write
>>>  dup2(dummy.Handle, 1)
>>>  dup2(dummy.handle, 2)
>>>End
>>>Should give you what you want without all the fiddle
>>>"Failure is the key to success; 
>>> each mistake teaches us something"  .. Morihei Ueshiba
>>>Brian G
>>>
>>>----- On Aug 7, 2021, at 12:39 PM, Bruce Steers < bsteers4 at gmail.com> wrote:
>>>>
>>>>
>>>>On Thu, 5 Aug 2021 at 20:34, Bruce Steers < bsteers4 at gmail.com> wrote:
>>>>>
>>>>>
>>>>>On Wed, 4 Aug 2021 at 00:53, < jose.rodriguez at cenpalab.cu> wrote:
>>>>>>August 3, 2021 2:29 PM, "Bruce Steers" < bsteers4 at gmail.com> wrote:
>>>>>>>I have this program i'm developing that was starting and stopping cleanly then i recently added some controls and did various other things and now it says this when it starts...
>>>>>>>(Desktop-ish:12906): Gtk-WARNING **: 16:29:25.336: Theme parsing error:  :1:15: Expected a valid selectorIs there a way to track down what's causing it?
>>>>>>>thanks
>>>>>>>BruceS
>>>>>>
>>>>>>GTK has always output loads of different errors with many programs (not gambas ones, I mean), when run in a terminal. People say it depends on the current theme and whatnot...
>>>>>>
>>>>>
>>>>>Indeed, Pluma was always my texteditor of choice and that used to pump out loads of warnings.
>>>>>(but now of course i use my own editor i wrote with gambas that has all those cool Texteditor features ;) ) 
>>>>>
>>>>>Would be great to be able to catch the warnings though.
>>>>>Either a way to track what exactly is causing them or just suppress the messages.
>>>>>
>>>>>
>>>>>
>>>>>BruceS
>>>>
>>>>
>>>>so best answer i have so far is this "hack"...
>>>>Uses gb.args
>>>>if the arg -q or --quiet is given then before the app loads it launches itself with any and all args plus "2> /dev/null" to redirect the error output and an additional arg -s.
>>>>
>>>>when the 2nd run instance quits the 1st one that launched the second one also quits before it's even done anything.
>>>>
>>>>
>>>>Public Sub _new()
>>>>
>>>>  Args.Begin()
>>>>  Dim bQuiet As Boolean = Args.Has("q", "quiet", "supress gtk error messages")
>>>>  If bQuiet Then bQuiet = (Args.Has("s", "supressed", "supressed gtk error warnings") == False)
>>>>  Args.End()
>>>>
>>>>  If bQuiet And File.In.IsTerm Then  ' if we are not run from a terminal then no need for any of this
>>>>    Dim sRestOfargs As String[] = Args.All.Copy()
>>>>
>>>>    ' the next 2 lines just handle if being run from the IDE and make Arg[0] be executable name.
>>>>    If Not InStr(sRestOfargs[0], "/") Then sRestOfargs[0] = Application.Path &/ Application.Name
>>>>    If File.Ext(sRestOfargs[0]) <> "gambas" Then sRestOfargs[0] &= ".gambas"   
>>>>
>>>>    sRestOfargs.Insert(["-s", "2> /dev/null"])
>>>>    Shell sRestOfargs.Join(" ")
>>>>    Me.Close
>>>>    Return
>>>>  Endif
>>>>
>>>>End
>>>>
>>>>Attached is a simple test app
>>>>It's a form with a tiny little TextArea in it, so small it produces warnings on my system when i move the mouse around the window...
>>>>(Test:79673): Gdk-CRITICAL **: 20:26:58.775: gdk_window_is_visible: assertion 'GDK_IS_WINDOW (window)' failed
>>>>
>>>>Run with -q and all is quiet.
>>>>./Test.gambas -q
>>>>
>>>>Of course this method will suppress ANY error messages , 
>>>>shell commands can be fixed by adding '> 2&1' 
>>>>Shell "/run/mycommand 2> &1"
>>>>that redirects error output to stdout and stdout is still showing
>>>>
>>>>Please somebody tell me there's a better way...
>>>>
>>>>BruceS
>>>>
>>>>
>>>>
>>>>----[  http://gambaswiki.org/wiki/doc/netiquette ]----
>>>
>>>----[  http://gambaswiki.org/wiki/doc/netiquette ]----
>>
>>
>>----[  http://gambaswiki.org/wiki/doc/netiquette ]----
>
>----[  http://gambaswiki.org/wiki/doc/netiquette ]----
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.gambas-basic.org/pipermail/user/attachments/20210810/1da25bd0/attachment-0001.htm>


More information about the User mailing list