Blue Static

Archive for the ‘MacGDBp’ tag

MacGDBp 2.0.2 Released

Posted on April 18, 2020 at 07:00 UTC, filed under the category MacGDBp. Tags: software, MacGDBp,

Today I’m releasing MacGDBp 2.0.2 to address a major issue with the auto-updater and some other minor product bugs.

Somehow when upgrading the Sparkle updater framework when working on MacGDBp 2.0, the auto-update relauncher binary lost its executable bit. This resulted in the auto-update installation hanging indefinitely. Unfortunatley there is no way to automatically recover from this state. Users can run:

chmod +x*

… and re-run the in-product updater. Or simply download version 2.0.2 which has resolved the issue.

You can download MacGDBp 2.0.2 from the product page.

MacGDBp 2.0.1 Released

Posted on April 11, 2020 at 07:00 UTC, filed under the category MacGDBp. Tags: software, MacGDBp,

In March I quietly promoted the 2.0 beta 1 release to be the final, stable build. I decided to not do a blog post because there were no changes from the beta build.

Today I’m releasing 2.0.1 to address some issues. Thank you to everyone who reported these bugs. The release also improves dark mode support in the source viewer, which you can see below.

You can download MacGDBp 2.0.1 from the product page or by updating via Sparkle.

MacGDBp 2.0 Beta 1 Released

Posted on January 4, 2020 at 13:30 UTC, filed under the category MacGDBp. Tags: software, MacGDBp,

While I did state that the first beta of MacGDBp would be out by the end of the year, I decided against pushing a new build before immediately disappearing on holiday for two weeks. But today is the day!

Version 2.0 is not a complete rewrite, but virtually every aspect of the app has been updated and improved. The biggest changes are under-the-hood, particularly around the interaction between the frontend and the remote debugger, which now accurately tracks “transactions.” This allows MacGDBp to fetch the contents of long arrays or large objects without issue. In addition, several components have been refactored to improve the project’s code health and the app’s robustness. These improvements fixed numerous long-standing bugs in the app.

The biggest new feature, by popular demand, is the ability to set symbolic breakpoints. This will pause the debugger any time a function of a given name is called, rather than having to rely solely on file/line breakpoints.

Unfortunately, the app will remain un-sandboxed and not code signed. The Sparkle updater is not yet compatible with the app sandbox. And Apple’s annoying two-factor authentication requirements rule out (for me) obtaining a signing certificate. Sparkle will still verify the updates’ signature, however.

Finally, MacGDBp 2.0 sports a new, unified interface. All of the panels and windows have been collapsed into a single, tabbed window.

See the changelog for the full list of new features and bug fixes.

You can download MacGDBp 2.0 Beta 1 from the product page.

Looking Towards the Future

Posted on October 28, 2019 at 15:30 UTC, filed under the category MacGDBp. Tags: software, MacGDBp,

First, welcome to the new Blue Static! The site has a fresh coat of paint, it has been made more mobile-friendly, and I have updated much of the content, pruning extremely old things while keeping still-old-but-maybe-interesting items around for posterity. For the first time in the history of the site, Blue Static is no longer powered by PHP: the entire site is now rendered as static files by Hugo.

It has been well over seven years since this site was last updated, and that is because I no longer have the substantial amounts of time I once had to dedicate to Blue Static software. Since I now spend all of my working hours writing and maintaining software, the allure of doing so as a hobby has unfortunately diminished.

Over the past few months, I’ve pondered how to move forward with the various Blue Static projects. I’ll outline some of those decisions now:

MacGDBp still has a large number of loyal users. I’m happy to report that in these intervening years, I’ve worked sporadically on the next major version. The first beta of MacGDBp 2.0 will be released before the end of the year! The entire core debugging engine has been rewritten and made more robust, which has fixed many bugs and added new features. The new version will also be code signed and notarized to be compliant with Apple’s increasingly locked-down macOS.

RGB Converter will remain available for download, but because Apple has removed Dashboard in macOS 10.15 Catalina, the widget will not be updated anymore.

Bugdar is the project that I’ve struggled to make a decision on. It is fairly safe to say that any 2.0 greenfield rewrite will not happen. However all of Blue Static’s bugs remain in the Bugdar instance that runs on this site, so it cannot go anywhere over night. I am not currently enamored with other options, such as Github’s issue tracker, so despite Bugdar’s visible age I will continue to run it for Blue Static’s purposes. There may be an infrequent maintenance update, but I do not expect to make major changes to the software at this time.

What drove these decisions is that I have largely stopped writing software in PHP. It is no longer my language of choice, and my interests have moved on to other programming languages and software domains. MacGDBp remains important to me beacuse others find it useful and the code is still fun to work on.

I’ll close with a teaser: there is at least one new project that I will be publishing in the future under Blue Static. It has to do with email and is geared towards power-users.

Look forward to MacGDBp 2.0 Beta 1 coming to a Sparkle update near you!

MacGDBp 1.5 Released

Posted on September 3, 2012 at 01:50 UTC, filed under the category MacGDBp. Tags: Cocoa, mac os x, MacGDBp,

MacGDBp 1.5 has been released. This update fixes a crash on 10.8 when adding a breakpoint. Credit for the fix goes to Paul Mitchell and Sam Fleming.

This release also includes a new feature that allows you to evaluate and see the result of an arbitrary PHP expression. For example, you can use print_r to get a different view of PHP objects:

Full details are in the changelog.

Tracking Info:
Current SHA1: 0508dff
Last Release Build: Sun Sep 2 21:13:38 EDT 2012

MacGDBp 1.4.1 Released

Posted on April 29, 2011 at 04:58 UTC, filed under the category MacGDBp. Tags: Cocoa, mac os x, MacGDBp,

MacGDBp 1.4.1 has been released; this is a maintenance update that fixes a few bugs. I meant to get this release out a few weeks ago, but I’ve been travelling recently and didn’t have the time.

You can download MacGDBp 1.4.1 from this page. Please file any new issues in the bug tracker.

Tracking Info:
Current SHA1: 7fde123
Last Release Build: 2011-04-29 00:33:16

MacGDBp 1.4 Released [u]

Posted on February 26, 2011 at 18:08 UTC, filed under the category MacGDBp. Tags: mac os x, MacGDBp,

After a slight delay trying to track down some bugs, I’ve decided to push MacGDBp 1.4 to stable distribution. While this release is not quite perfect and there are a few known issues (listed on the project page), I was tired of blocking the release on relatively minor bugs. This release has been a year in the making, and it makes significant improvements over the 1.3 branch. To find out more about what went into making this new version, check out some of the older posts on the blog.

You can download MacGDBp 1.4 from this page. Please file any new issues in the bug tracker.

Update: A minor bug had to be fixed with the released package. I’ve pushed a new binary and the few people who have downloaded the update will be prompted to update again.

Tracking Info:
Current SHA1: 4ce0d31 d746f73e
Version: .83
Last Release Build: 2011-02-26 14:21:17 2011-02-26 12:29:16

MacGDBp 1.4 Beta 2

Posted on January 15, 2011 at 05:26 UTC, filed under the category MacGDBp. Tags: Cocoa, mac os x, MacGDBp,

I’m happy to announce MacGDBp 1.4 Beta 2. It’s been nearly a month since the first beta was released and more than 200 people have tested Beta 1. I haven’t received any critical bug reports, which means that the internals are stable enough to ship. Beta 2 is the Release Candidate; barring any significant issues, this will be promoted to Stable in a month or less.

This release has a couple of bug fixes and adds two small enhancements:

You can download MacGDBp 1.4 Beta 2 from this page. Please file any new issues in the bug tracker.

Tracking Info:
Current SHA1: 5cfd0db
Version: β2
Last Release Build: 2011-01-14 23:48:03

MacGDBp 1.4 Beta 1

Posted on December 18, 2010 at 22:17 UTC, filed under the category MacGDBp. Tags: mac os x, MacGDBp,

I’m happy to announce the first beta of MacGDBp 1.4. This release represents nearly a year’s worth of work rewriting the entire internal structure of the application. As mentioned previously, MacGDBp 1.4 now communicates to the backend in an asynchronous manner. Not only does this change increase the robustness of the program, it should no longer beachball while waiting for responses from Xdebug. Because it took such a long time to stabilize this branch, there is very little in the way of new features for this release: almost all the work for this release was done for making the network changes and increasing stability.

One new point to be aware of is that the concept of “reconnect” is gone in this version. Instead, the debugger is now either attached to the backend or is detached. When attached, MacGDBp will start debugging any connections from Xdebug. When detached, MacGDBp will send the “detach” command immediately after receiving any new connections, aborting the debug.

There is one known issue:

You can download MacGDBp 1.4 Beta 1 from this page. Please try out this new version and file any new issues in the bug tracker.

Tracking Info:
Current SHA1: 1ffc93e
Version: β1
Last Release Build: 2010-12-18 14:18:34

NSAttributedString Spins a Nested Run Loop [u]

Posted on May 31, 2010 at 23:03 UTC, filed under the category Cocoa. Tags: Cocoa, mac os x, MacGDBp,

Today I spent some time debugging MacGDBp 1.4. The issue I was having was that socket data was being processed out of order, and I couldn’t figure out why. Until I stuck it in the debugger. It turns out that when you call -[NSAttributedString initWithHTML:documentAttributes:], it spins the run loop internally (making a nested run loop). If, for example, you have a socket scheduled on the main run loop in common modes, the socket will signaled if you create the NSAttributedString on the main thread. Here’s a stack trace:

#0  0x0000495e in -[DebuggerConnection handlePacket:] at DebuggerConnection.m:597
#1  0x000044e8 in -[DebuggerConnection readStreamHasData] at DebuggerConnection.m:508
#2  0x00003243 in ReadStreamCallback at DebuggerConnection.m:76
#3  0x9021cdd3 in _signalEventSync
#4  0x9021d7be in _cfstream_solo_signalEventSync
#5  0x9021ca88 in _CFStreamSignalEvent
#6  0x9021d707 in CFReadStreamSignalEvent
#7  0x906e7cd9 in SocketStream::dispatchSignalFromSocketCallbackUnlocked
#8  0x90694819 in SocketStream::socketCallback
#9  0x90694721 in SocketStream::_SocketCallBack_stream
#10 0x901d91ae in __CFSocketDoCallback
#11 0x901d8c97 in __CFSocketPerformV0
#12 0x90192ff1 in __CFRunLoopDoSources0
#13 0x90190c1f in __CFRunLoopRun
#14 0x901900f4 in CFRunLoopRunSpecific
#15 0x9018ff21 in CFRunLoopRunInMode
#16 0x989ee6e8 in -[NSHTMLReader _loadUsingWebKit]
#17 0x989e2ddb in -[NSHTMLReader attributedString]
#18 0x98842585 in _NSReadAttributedStringFromURLOrData
#19 0x9883f910 in -[NSAttributedString(NSAttributedStringKitAdditions) initWithData:options:documentAttributes:error:]
#20 0x98887a35 in -[NSAttributedString(NSAttributedStringKitAdditions) initWithHTML:options:documentAttributes:]
#21 0x988879a9 in -[NSAttributedString(NSAttributedStringKitAdditions) initWithHTML:documentAttributes:]
#22 0x0000acf7 in -[BSSourceView setFile:] at BSSourceView.m:93
#23 0x0000af91 in -[BSSourceView setString:asFile:] at BSSourceView.m:120
#24 0x00007bae in -[DebuggerController updateSourceViewer] at DebuggerController.m:264
#25 0x000081e4 in -[DebuggerController sourceUpdated:] at DebuggerController.m:353
#26 0x00005a6b in -[DebuggerConnection setSource:] at DebuggerConnection.m:839
#27 0x00004ecf in -[DebuggerConnection handleResponse:] at DebuggerConnection.m:694
#28 0x000049cc in -[DebuggerConnection handlePacket:] at DebuggerConnection.m:600
#29 0x000044e8 in -[DebuggerConnection readStreamHasData] at DebuggerConnection.m:508
#30 0x00003243 in ReadStreamCallback at DebuggerConnection.m:76
#31 0x9021cdd3 in _signalEventSync
#32 0x9021cd58 in _cfstream_shared_signalEventSync
#33 0x9019315b in __CFRunLoopDoSources0
#34 0x90190c1f in __CFRunLoopRun
#35 0x901900f4 in CFRunLoopRunSpecific
#36 0x9018ff21 in CFRunLoopRunInMode
#37 0x944ed0fc in RunCurrentEventLoopInMode
#38 0x944eceb1 in ReceiveNextEventCommon
#39 0x944ecd36 in BlockUntilNextEventMatchingListInMode
#40 0x98605135 in _DPSNextEvent
#41 0x98604976 in -[NSApplication nextEventMatchingMask:untilDate:inMode:dequeue:]
#42 0x985c6bef in -[NSApplication run]
#43 0x985bec85 in NSApplicationMain
#44 0x00002c44 in main at main.m:21

At frame 30, the socket callback gets signaled because data is ready. This happens on the outermost loop invocation, which is supposed to happen (yay!). At frame 22, the data for this most recent network packet is still being processed. At frame 21, there’s the call to initWithHTML for NSAttributedString. And at frame 15, trouble starts when the run loop gets spun again, while still processing sources from the first/outermost run loop invocation. At frame 2, while still processing the packet from frame 30, the socket source gets signaled again and new data is read and processed, while still processing the first piece of data. Sigh.

I haven’t yet decided how I’m going to get around this problem. The issue is that more data gets read from the socket before the current packet finishes handling, making a hot mess (it screws up internal state). The easiest conceptual solution is to push the socket stuff into its own thread on its own run loop, but that will require a fairly significant refactoring. Another option would be to schedule the socket in its own run loop mode, but then I’d be responsible for spinning the loop myself and would have to manage that carefully.

Update: I bit the bullet and refactored. In the long run, this is probably a good thing because it forced a separation of components that deal with CFNetwork itself and the response to the data received from it. It also split a 1032 line file into two files, one about 600 lines and one about 500 lines.

« Older Entries