Jump to content
adrian

Tracy Debugger

Recommended Posts

I'm having an issue with the Request Info panel randomly not showing various info at the bottom. Here are 2 pages, next to each other – one shows the edit pencil, the other doesn't; this has been happening on several sites.

without.jpg.09c378993c04f38ee53fbae32eef86aa.jpg

with.jpg.48ccbf03cf4149398570227a2a18afd1.jpg

  • Like 1

Share this post


Link to post
Share on other sites

Hey @Macrura - you gotta give me more than that 🙂

Seriously though, it looks like there is something breaking output for the Server Request section, or perhaps it's actually being broken in the preceding Field List & Values section. Could you please try disabling those two sections (in the config settings there are checkboxes) and see if that fixes things? Then perhaps you could narrow down what part of the section is failing please?

My gut feeling is that it is the Field List & Values section and there is some field that is breaking things.

Thanks.

Share this post


Link to post
Share on other sites

Ok thanks for the clue, so i have checked the Field List and Values accordion, which I hadn't used before, and i see that the table is corrupted.

There is a column outputting a RuntimeMarkup field which contains an admin data table. I have checked the HTML on that and it is all valid; But the existence of that table in the unformatted column of the RuntimeMarkup field's row is breaking the table and causing the next cell to contain the rest of the table inside it.

Now looking at the code in the bottom of the source view, i can see that my admin table markup is outputting table tags which are presumably breaking the panel's table markup. I wonder if there is any way to encode that to prevent this... I tried enabling/disabling the $table->setEncodeEntities(true/false) but did not fix the issue.

thanks!

 

  • Like 1

Share this post


Link to post
Share on other sites

Thanks @Macrura - that got me on the right track - should be fixed in the latest version.

  • Like 1

Share this post


Link to post
Share on other sites

Question.

Is there a way to see all the available properties on a module? I use RepeaterMatrix quite a bit and use the 'type' property within the loop but I also want to return the name/label of each type and I wondered if there was any way to see what else is available other than $row->type?

This is just one example, of course...

Share this post


Link to post
Share on other sites

You can just dump() or barDump() the $row object:

HqoKZvg.png

You have the "debug info" and the "full object" options.

Share this post


Link to post
Share on other sites

@adrian any idea what could be the cause for this: Error in ProcesswireLogsPanel

ProcessWire\WireException: Unable to encode array data for cache: TracyLogData.ProcessWire in C:\www\xxx\wire\core\WireCache.php:450
Stack trace:
#0 C:\www\xxx\site\assets\cache\FileCompiler\site\modules\TracyDebugger\panels\ProcesswireLogsPanel.php(44): ProcessWire\WireCache->save('TracyLogData.Pr...', false, '2010-04-08 03:1...')
#1 C:\www\xxx\site\assets\cache\FileCompiler\site\modules\TracyDebugger\tracy-2.6.x\src\Tracy\Bar\Bar.php(147): ProcesswireLogsPanel->getTab()
#2 C:\www\xxx\site\assets\cache\FileCompiler\site\modules\TracyDebugger\tracy-2.6.x\src\Tracy\Bar\Bar.php(121): Tracy\Bar->renderPanels('')
#3 C:\www\xxx\site\assets\cache\FileCompiler\site\modules\TracyDebugger\tracy-2.6.x\src\Tracy\Bar\Bar.php(97): Tracy\Bar->renderHtml('main')
#4 C:\www\xxx\site\assets\cache\FileCompiler\site\modules\TracyDebugger\TracyDebugger.module.php(1713): Tracy\Bar->render()
#5 C:\www\xxx\wire\core\Wire.php(383): TracyDebugger->sessionHandlerDBAjaxFix(Object(ProcessWire\HookEvent))
#6 C:\www\xxx\wire\core\WireHooks.php(917): ProcessWire\Wire->_callMethod('sessionHandlerD...', Array)
#7 C:\www\xxx\wire\core\Wire.php(442): ProcessWire\WireHooks->runHooks(Object(ProcessWire\ProcessWire), 'finished', Array)
#8 C:\www\xxx\wire\core\ProcessWire.php(609): ProcessWire\Wire->__call('finished', Array)
#9 C:\www\xxx\wire\core\ProcessWire.php(505): ProcessWire\ProcessWire->__call('finished', Array)
#10 C:\www\xxx\wire\modules\Process\ProcessPageView.module(258): ProcessWire\ProcessWire->setStatus(16)
#11 C:\www\xxx\wire\core\Wire.php(380): ProcessWire\ProcessPageView->___finished()
#12 C:\www\xxx\wire\core\WireHooks.php(813): ProcessWire\Wire->_callMethod('___finished', Array)
#13 C:\www\xxx\wire\core\Wire.php(442): ProcessWire\WireHooks->runHooks(Object(ProcessWire\ProcessPageView), 'finished', Array)
#14 C:\www\xxx\index.php(56): ProcessWire\Wire->__call('finished', Array)
#15 {main}

Latest version. Error seems to occur only on windows (but not sure).

Share this post


Link to post
Share on other sites
4 hours ago, bernhard said:

any idea what could be the cause for this: Error in ProcesswireLogsPanel

Note sure - would you mind finding out what contents of $logLinesData is just before line 44 of ProcesswireLogsPanel.php and also $data before and after the json_encode() on line 449 of wire/core/WireCache.php

Hopefully one/both of those will help to identify the problem. Thanks!

Share this post


Link to post
Share on other sites

Thx that helped! I just deleted the exceptions.txt logfile which had some base64 encoded string in it. I guess this was the culprit 🙂 

Share this post


Link to post
Share on other sites
8 hours ago, bernhard said:

Thx that helped! I just deleted the exceptions.txt logfile which had some base64 encoded string in it. I guess this was the culprit 🙂 

Glad you got things working again, but I can't imagine why a base64 encoded string would cause a problem. I just tried here and it looked ok. Maybe that wasn't really the issue but somehow the exceptions.txt was corrupted in some other way?

Share this post


Link to post
Share on other sites

I had some weird symbols in that file where the base64 encoded string was. No idea where they came from, but I will only investigate if the problem occurs again. Thx for your help!

  • Like 1

Share this post


Link to post
Share on other sites

Hi all,

Just wanted to share a tip that can be useful if you want to debug a core file before Tracy has been loaded.

Suppose you were debugging ProcessWire::getHttpHost() and for some reason wanted to dump the $host variable just before it is returned.

If you add the line...

bd($host, 'host');

...then you'll get a fatal error when the code runs because Tracy has not yet been loaded and so the bd() function is undefined.

2019-09-28_151822.png.b557b5d15c563e966215fe5d2e43c312.png

When debugging core files you'll find a number of places like this where the Tracy dump functions are not available.

A workaround for this is to set the variable that you want to dump as a custom property on the Wire object. You want to be careful not to use a property name that clashes with any existing Wire properties or API variables - adding a prefix like "td_" is a safe bet.

$this->wire()->set('td_host', $host);

Now in /site/ready.php you can dump the variable that you stored on the Wire object:

bd($wire->td_host, 'host');

...or shorter (thanks @adrian)...

bd($td_host, 'host');

2019-09-28_152538.png.73a83eb92622f387f5944ea93c7d830f.png

Edited by Robin S
Shorter way to dump variable on Wire object
  • Like 4

Share this post


Link to post
Share on other sites

Really great idea @Robin S !

You can make it even less work by using d($td_host) in the Console panel:

image.png.2965e39a2d0e6a0b0ed86ac05f4b0345.png

  • Like 3

Share this post


Link to post
Share on other sites

@Robin S - what do you think about this idea - I am contemplating having Tracy check $wire for any variables prefixed with "bd_" and automatically bd() them without the need to manually make a bd() or d() call. The title would be automatically set to the name of the variable after the "bd_" prefix.

PS - remember you can set $wire variables like this:

$this->wire('bd_host', $host);

The shorter the better when adding debug statements 🙂

  • Like 2

Share this post


Link to post
Share on other sites
7 hours ago, adrian said:

I am contemplating having Tracy check $wire for any variables prefixed with "bd_" and automatically bd() them without the need to manually make a bd() or d() call. The title would be automatically set to the name of the variable after the "bd_" prefix.

I like it! Not only is it easier but it makes it less likely that the setting of the $wire variable will be accidentally left behind after debugging is finished.

  • Like 1

Share this post


Link to post
Share on other sites
4 hours ago, Robin S said:

I like it! Not only is it easier but it makes it less likely that the setting of the $wire variable will be accidentally left behind after debugging is finished.

Done!

$this->wire('bd_host', $host);

results in:
image.png.d419a31150ac9eff4911f31722d5557d.png

I decided to add the $ and keep the "bd_" prefix in the title to help better identify it as an automatically dumped wire variable.

Let me know if you have any suggestions for improvements.

 

  • Like 5

Share this post


Link to post
Share on other sites

Hey @adrian

just doing some debugging and having a hard time finding out what's going on 😄 Is there a way to see the debug_backtrace easily? I mean something like the backtrace shown when an exception is thrown, but without throwing the exception and just showing the tracy in the debug bar. This could be extremely helpful in many situations. I've installed xdebug but it makes things so slow (~20s page load instead of <1s 😮 ).

An example:

In one of my modules a file is included twice instead of once. That's easy to find out via bd('fired') that will show 2 dumps in the bar. It's not so easy to find out WHY this happens and what triggered the call. When I throw an exception the trace is shown, but that's the first call. It would be nice to analyze both. It would be absolutely awesome if we could do something like

trace()

and get a collapsed backtrace that we can analyze step by step, click on the line of code, etc.

I guess that could be helpful for everyone! Thx 🙂 

Share this post


Link to post
Share on other sites

Hi @adrian,

I have a little problem with the User Switcher panel: there's a config option for limiting the list of users that appear in the panel, which is great because often there can be a lot of front-end-only users. But the problem for me is that the option gets defined in terms of roles that are excluded rather than included:

2019-10-15_163441.png.d0e5070ef33bc6063acbff5141945786.png

I'm not sure how common this is for others, but I often give back-end users (who I want to be able to switch to via the User Switcher) front-end roles because they can also be "members" as well as "administrators". So these kinds of users have multiple roles. What do you think about adding an "include only these roles" option for User Switcher as well as a "exclude these roles" option? Or maybe you have another idea of how this might be accommodated?

Edited by Robin S
Post got duplicated on submit. Weird.

Share this post


Link to post
Share on other sites

Hi @Robin S - happy to add this. Just playing around with it now and I guess the main issue is that when "including" we need to go with "OR" when matching users to roles, but I think we still want "AND" with "excluded (restricted) roles". Because you want to be able to include different admin roles but not require the users to have all these roles. But if you want to exclude/restrict like the current behavior, then you want to exclude all users with any of the selected rules. Does that seem like the correct behavior to you?

  • Like 1

Share this post


Link to post
Share on other sites
3 minutes ago, adrian said:

Does that seem like the correct behavior to you?

I'm sure you're right, but I'm not 100% clear on what you mean here. It seems like both include and exclude settings would use OR conditions:

  • exclude (role1 OR role2 OR role3)
  • include only (role1 OR role2 OR role3)

Or maybe you mean AND/OR in terms of combining the two settings? "exclude (roles) AND include (roles)" versus "exclude (roles) OR include (roles)"
I imagined using one setting or the other but not both, but maybe there are some situations where a user would want to combine them.

Share this post


Link to post
Share on other sites

I am noting that you can only use or the other - you can't combine exclude and include. So the AND/OR is within each option, not between.

I think it's the typical AND/OR issue when you're using the (!) NOT operator - you need to switch from OR to AND.

So, the selector for exclude is: roles!=1021, roles!=38

And the one for include is: roles=1021|38

Anyway, I have committed a new version with this functionality - please test and let me know how it goes.

  • Like 1

Share this post


Link to post
Share on other sites
On 10/12/2019 at 3:53 AM, bernhard said:

It would be absolutely awesome if we could do something like


trace()

and get a collapsed backtrace that we can analyze step by step, click on the line of code, etc.

I like the idea - just not sure if it's possible with the core of Tracy as it currently is because I think some of the methods I'd need to use are private. I had a quick attempt and came up against these, but I'll try again later.

Remember PW has a new bd(Debug::backtrace());  method you can use, but of course it returns an simply array, the same as PHP's debug_backtrace(), so I know it's not what you are looking for.

Share this post


Link to post
Share on other sites
10 minutes ago, adrian said:

Anyway, I have committed a new version with this functionality - please test and let me know how it goes.

Awesome, works great!

  • Like 1

Share this post


Link to post
Share on other sites

@bernhard -  can you please try adding these to a template file where you want to see a debug_backtrace() and let me know if it satisfies your needs:

$blueScreen = new Tracy\BlueScreen;
$blueScreen->render(new Exception);

If you think that works OK, I'll setup a trace() shortcut.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • By joshua
      This module is (yet another) way for implementing a cookie management solution.
      Of course there are several other possibilities:
      - https://processwire.com/talk/topic/22920-klaro-cookie-consent-manager/
      - https://github.com/webmanufaktur/CookieManagementBanner
      - https://github.com/johannesdachsel/cookiemonster
      - https://www.oiljs.org/
      - ... and so on ...
      In this module you can configure which kind of cookie categories you want to manage:

      You can also enable the support for respecting the Do-Not-Track (DNT) header to don't annoy users, who already decided for all their browsing experience.
      Currently there are four possible cookie groups:
      - Necessary (always enabled)
      - Statistics
      - Marketing
      - External Media
      All groups can be renamed, so feel free to use other cookie group names. I just haven't found a way to implement a "repeater like" field as configurable module field ...
      When you want to load specific scripts ( like Google Analytics, Google Maps, ...) only after the user's content to this specific category of cookies, just use the following script syntax:
      <script type="optin" data-type="text/javascript" data-category="statistics" data-src="/path/to/your/statistic/script.js"></script> <script type="optin" data-type="text/javascript" data-category="marketing" data-src="/path/to/your/mareketing/script.js"></script> <script type="optin" data-type="text/javascript" data-category="external_media" data-src="/path/to/your/external-media/script.js"></script> <script type="optin" data-type="text/javascript" data-category="marketing">console.log("Inline scripts are also working!");</script> The type has to be "optin" to get recognized by PrivacyWire, the data-attributes are giving hints, how the script shall be loaded, if the data-category is within the cookie consents of the user. These scripts are loaded asynchronously after the user made the decision.
      If you want to give the users the possibility to change their consent, you can use the following Textformatter:
      [[privacywire-choose-cookies]] It's planned to add also other Textformatters to opt-out of specific cookie groups or delete the whole consent cookie.
      You can also add a custom link to output the banner again with a link / button with following class:
      <a href="#" class="privacywire-show-options">Show Cookie Options</a> <button class="privacywire-show-options">Show Cookie Options</button> This module is still in development, but we already use it on several production websites.
      You find it here: PrivacyWire Git Repo
      Download as .zip
      I would love to hear your feedback 🙂
      CHANGELOG
      0.0.5 Multi-language support included completely (also in TextFormatter). Added possibility to async load other assets (e.g. <img type="optin" data-category="marketing" data-src="https://via.placeholder.com/300x300">) 0.0.4 Added possibility to add an imprint link to the banner 0.0.3 Multi-language support for module config (still in development) 0.0.2 First release 0.0.1 Early development
    • By MoritzLost
      This is a new module that provides a simple solution to clearing all your cache layers at once, and an extensible interface to perform various cache-related actions.
      The simple motivation behind this module was that I was tired of manually clearing caches in several places after deploying a change on a live site. The basic purpose of this module is a simple Clear all caches link in the Setup menu which clears out all caches, no matter where they hide. You can customize what exactly the module does through it's configuration menu:
      Expire or delete all cache entries in the database, or selectively clear caches by namespace ($cache API) Clear the the template render cache. Clear out specific folders inside your site's cache directory (/site/assets/cache) Refresh version strings for static assets to bust client-side browser caches (this requires some setup, see the full documentation for details). This is the basic function of the module. However, you can also add different cache management action through the API and execute them through the module's interface. For this advanced usage, the module provides:
      An interface to see all available cache actions and execute them. A system log and logging output on the module page to see verify what the module is doing. A CacheControlTools class with utility functions to clear out different caches. An API to add cache actions, execute them programmatically and even modify the default action. Permission management, allowing you granular control over which user roles can execute which actions. The complete documentation can be found in the module's README.
      Beta release
      Note that I consider this a Beta release. Since the module is relatively aggressive in deleting some caches, I would advise you to install in on a test environment before using it on a live site.
      Let me know if you're getting any errors, have trouble using the module or if you have suggestions for improvement!
      In particular, can someone let me know if this module causes any problems with the ProCache module? I don't own or use it, so I can't check. As far as I can tell, ProCache uses a folder inside the cache directory to cache static pages, so my module should be able to clear the ProCache site cache as well, I'd appreciate it if someone can test that for me.
      Future plans
      If there is some interest in this, I plan to expand this to a more general cache management solution. I particular, I would like to add additional cache actions. Some ideas that came to mind:
      Warming up the template render cache for publicly accessible pages. Removing all active user sessions. Let me know if you have more suggestions!
      Links
      https://github.com/MoritzLost/ProcessCacheControl ProcessCacheControl in the Module directory

    • By David Karich
      Admin Page Tree Multiple Sorting
      ClassName: ProcessPageListMultipleSorting
      Extend the ordinary sort of children of a template in the admin page tree with multiple properties. For each template, you can define your own rule. Write each template (template-name) in a row, followed by a colon and then the additional field names for sorting.
      Example: All children of the template "blog" to be sorted in descending order according to the date of creation, then descending by modification date, and then by title. Type:
      blog: -created, -modified, title  Installation
      Copy the files for this module to /site/modules/ProcessPageListMultipleSorting/ In admin: Modules > Check for new modules. Install Module "Admin Page Tree Multible Sorting". Alternative in ProcessWire 2.4+
      Login to ProcessWire backend and go to Modules Click tab "New" and enter Module Class Name: "ProcessPageListMultipleSorting" Click "Download and Install"   Compatibility   I have currently tested the module only under PW 2.6+, but think that it works on older versions too. Maybe someone can give a feedback.     Download   PW-Repo: http://modules.processwire.com/modules/process-page-list-multiple-sorting/ GitHub: https://github.com/FlipZoomMedia/Processwire-ProcessPageListMultipleSorting     I hope someone can use the module. Have fun and best regards, David
    • By dimitrios
      Hello,
      this module can publish content of a Processwire page on a Facebook page, triggered by saving the Processwire page.
      To set it up, configure the module with a Facebook app ID, secret and a Page ID. Following is additional configuration on Facebook for developers:
      Minimum Required Facebook App configuration:
      on Settings -> Basics, provide the App Domains, provide the Site URL, on Settings -> Advanced, set the API version (has been tested up to v3.3), add Product: Facebook Login, on Facebook Login -> Settings, set Client OAuth Login: Yes, set Web OAuth Login: Yes, set Enforce HTTPS: Yes, add "https://www.example.com/processwire/page/" to field Valid OAuth Redirect URIs. This module is configurable as follows:
      Templates: posts can take place only for pages with the defined templates. On/Off switch: specify a checkbox field that will not allow the post if checked. Specify a message and/or an image for the post.
      Usage
      edit the desired PW page and save; it will post right after the initial Facebook log in and permission granting. After that, an access token is kept.
       
      Download
      PW module directory: http://modules.processwire.com/modules/auto-fb-post/ Github: https://github.com/kastrind/AutoFbPost   Note: Facebook SDK for PHP is utilized.


×
×
  • Create New...