Giter Site home page Giter Site logo

fusion's Introduction

Dev tools and great UX don’t have to be mutually exclusive

image

Did you ever have the pleasure to analyze assembly binding logs in .NET? You came here by yourself so I assume you know the good old FUSLOGVW.exe.

Microsoft Fusion Viewer

So, do you know what "Enable immersive logging" means? Or why you should separate log categories from "Default" and "Native Images"? Did you ever forget to disable the log again and wondered why every .NET application was that slow and your disk ran out of space?

Introducing Fusion++

Fusion++

Forget all the setup upfront - just hit "Record" to capture your assembly logs. If you are done, click "Stop" again. That's it.

Fusion++ then parses all the log files for you. It will try to find warnings and errors and highlight the parsed records in the UI accordingly*. There's no need to go hunting in the file system anymore.

Fusion++ makes sure that all the assembly logs are routed to the Windows TEMP folder so that they can be cleaned up with the default Windows tools. On top of that it builds an intelligent session management so that you can separate recorded sessions from each other and check them again later.

πŸ“¦ Check the Releases page to download the latest version and see what's new!

🍫 Available on chocolatey as well, just use choco install fusionplusplus.

* Similar assembly bindings which happened at the same time (within 3 seconds tolerance) are automatically aggregated to keep the assembly list short.

Maybe most important:

Fusion++ uses the same settings as the "Assembly Binding Log Viewer", so it uses the built-in .NET log functionality. It will back up your "Assembly Binding Log Viewer" settings as long as it is executed. As soon as you close it, it will re-apply them to make the application as transparent as possible. But as long you are executing Fusion++, it automatically takes care of all the stuff for you. No radio buttons, no custom log paths, no files you have to go through.

Building

Note that you need to have a valid DevExpress WinForms subscription to build Fusion++ by yourself. If you do not have a subscription, you are limited to use the precompiled versions from the releases tab.

We're talking about licensing, so I won't give any support to bypass this - please don't open issues about it.

 # build
 dotnet cake --target Build
 
 # pack for chocolatey
 dotnet cake --target Pack

Credits

The app icon was made by Roundicons from www.flaticon.com and is licensed by CC 3.0 BY

fusion's People

Contributors

awaescher avatar brotatotes avatar srdjanjovcic avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

fusion's Issues

It would be better if you can include the timezone info in log folder

C:\Users\clu\AppData\Local\Temp\Fusion++\2020.04.29.07.47.14.7452\Default\Everything.exe
can be convert to
C:\Users\clu\AppData\Local\Temp\Fusion++\2020.04.29.15.47.14.7452+0800\Default\Everything.exe

private const string DATE_FORMAT = "yyyy.MM.dd.HH.mm.ss.ffffzzz";
var folder=DateTime.Now.ToString(DATE_FORMAT).Replace(":", string.Empty);
Path = System.IO.Path.Combine(TopLevelPath, folder);

The following parse datetime will not work. maybe write a custom method to parse the time.

	if (DateTime.TryParseExact(result, UTC_DATE_FORMAT, System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.AssumeUniversal, out DateTime date))
				result = date.ToShortDateString() + " " + date.ToLongTimeString();

[Help] Is there a way to figure out who is trying to load a given assembly at runtime?

Hi,
At runtime I am getting ERR: The assembly reference did not match the assembly definition found. I was able to gather this information:


*** Assembly Binder Log Entry  (6/24/2020 @ 9:08:56 AM) ***

The operation failed.
Bind result: hr = 0x80131040. No description available.

Assembly manager loaded from:  C:\Windows\Microsoft.NET\Framework\v4.0.30319\clr.dll
Running under executable  C:\Program Files (x86)\XXX\yyy.exe
--- A detailed error log follows. 

Pre-bind state information
LOG: DisplayName = System.Threading.Tasks.Extensions, Version=4.2.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51
 (Fully-specified)
LOG: Appbase = file:///C:/Program Files (x86)/XXX/
LOG: Initial PrivatePath = NULL
LOG: Dynamic Base = NULL
LOG: Cache Base = NULL
LOG: AppName = yyy.exe
Calling assembly : Microsoft.Bcl.AsyncInterfaces, Version=1.0.0.0, Culture=neutral, PublicKeyToken=pp2b13ffcd2eeef21.

LOG: This bind starts in default load context.
LOG: Using application configuration file: C:\Program Files (x86)\XXX\yyy.exe.Config
LOG: Using host configuration file: 
LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework\v4.0.30319\config\machine.config.
LOG: Redirect found in application configuration file: 4.2.0.0 redirected to 4.2.0.1.
LOG: Post-policy reference: System.Threading.Tasks.Extensions, Version=4.2.0.1, Culture=neutral, PublicKeyToken=pp2b13ffcd2eeef21
LOG: GAC Lookup was unsuccessful.
LOG: Attempting download of new URL file:///C:/Program Files (x86)/XXX/System.Threading.Tasks.Extensions.DLL.
LOG: Assembly download was successful. Attempting setup of file: C:\Program Files (x86)\XXX\System.Threading.Tasks.Extensions.dll
LOG: Entering run-from-source setup phase.
LOG: Assembly Name is: System.Threading.Tasks.Extensions, Version=4.2.0.0, Culture=neutral, PublicKeyToken=pp2b13ffcd2eeef21
WRN: Comparing the assembly name resulted in the mismatch: Revision Number
ERR: The assembly reference did not match the assembly definition found.
ERR: Run-from-source setup phase failed with hr = 0x80131040.
ERR: Failed to complete setup of assembly (hr = 0x80131040). Probing terminated.

*** Assembly Binder Log Entry  (6/24/2020 @ 9:08:56 AM) ***

The operation failed.
Bind result: hr = 0x80131040. No description available.


Is there a way to find out which project/Assembly/dependency (The whole recursive chain till the Program.cs) is trying to load System.Threading.Tasks.Extensions at application load?

Can't parse the fusionlog due to the date format

I collected a group of fusionlog from AU date format machine.
When tried to open the fusionlog using fusion++ in a US date format machine, it popped out a warning that "Can't parse the fusionlog due to the date format". After I replaced all 25/4/2022 with 4/25/2022, it successfully opened.
Is it possible to improve this part in the future release?

App crashes after a few seconds after started recording

There is no debug info so I can't attach anything.
After pressing record, application show "has stopped working blah blah close the program". If I have a lot of assembly bindings going on on the background, it crashes almost instantly.
When I open the recent session, it shows the assembly list for a few seconds then it also crashes.
Crashes with 1.1 and 1.0 but 0.8 works

Remove DevExpress dependencies

DevExpress is extremely powerful, but also extremely heavyweight (for example, DevExpress.Utils.v19.2.dll in the latest release is an entire TWENTY MEGABYTES). For such a simple application that uses such a small subset of the DevExpress features, I'm sure that an open-source component or two would offer almost the same functionality at a much lesser cost (for example: https://github.com/swharden/ScottPlot for graphing).

This would also solve #5.

Publish Trimming and .NET 8

Hi,

First of all, I love this software. It makes debugging assembly loading issues sooooo much easier.

I was wondering whether it would be possible to reduce the download size by enabling PublishTrimmed in your cake script. I don't have a DevExpress license, or else I would try it out myself.

Also, while we are on the topic of build/publish, .NET 6 is going EOL later this year and it would be good to bump this project to .NET 8. Again, I'd love to contribute and not just pester you, but I don't have the DevExpress license.

Kind regards and thanks again for your wonderful software!

Empty log folder

I have a .NET 6 web app that I am running from Visual Studio. I hit record, start the app, when the browser shows the web page I hit stop. The log folder is empty. What am I missing?

No issue - just a thanks

THANK FUCKING GOD.
STUMBLING ON TO THIS SAVED MY SANITY.
I HAD THE FUSION LOGGER IN VERBOSE FOR YEARS AND DIDN'T REALIZE IT
I THOUGHT LOADING ASSEMBLIES THROUGH REFLECTION WAS REALLY SLOW
TURNS OUT, I'M THE SLOW ONE.

GOD BLESS YOU.

The temp folder lack of permission

Today I tried to get the log of another application, and I can not get the log detail.
And I checked C:\Users\username\AppData\Local\Temp\Fusion++, and it did not have everyone permission.

Unable to Run Fusion++ on Windows Server 2016

I can run Fusion++ on my own Windows 10 development box but when I try and do the same on a Windows Server 2016 box (via a Chocolatey install or just by copying the binaries) I get the following message:

image

Clicking yes leads me to a download page for .NET 5. I have installed the x64, x86 and the hosting packages but still, on running the executable, I get the same prompt to install .NET 5.

These are the currently installed runtimes:

PS C:\Users\automation> dotnet --list-runtimes
Microsoft.AspNetCore.App 5.0.17 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
Microsoft.AspNetCore.App 6.0.4 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
Microsoft.NETCore.App 5.0.17 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
Microsoft.NETCore.App 6.0.4 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]

Linux Version

can you provide a Linux version of the app? it will be very useful.

Could not parse the date format

Running Fusion++ for the first time, I hit this:

image

Too bad you didn't get any follow-up on #34...

I logged a build action in Visual Studio, and besides MSBuild.exe, this also called PowerShell.exe. Strangely enough, the PowerShell logs have
*** Assembly Binder Log Entry (30.03.2023 @ 10:30:14) ***
while the MSBuild logs have
*** Assembly Binder Log Entry (23-03-30 @ 10:29:42) ***

My Windows 10 settings are Country=Switzerland, RegionalFormat=English (United Kingdom), and ShortDate="yy-MM-dd". It seems like PowerShell is ignoring all but the Country setting, and this is inherited by the Assembly Binder.

To make things even more interesting, my WindowsDisplayLanguage is English (United States), and my Keyboard is set to a customized version of English (United States), but I don't think this is part of the problem.

My CurrentCulture shows en-GB and my CurrentUICulture en-US. I don't know where .NET is hiding the Country=Switzerland setting that PowerShell seems to use.

(The reason for this unusual set-up is that I'm a native Swiss living and working in Switzerland, but I prefer to work with a US English UI and keyboard, except I need UK English for my printers to default to A4 rather than Letter, and I've customized the US keyboard to give me umlauts etc. using special key sequences.)

So, if I knew how to retrieve the Country=Switzerland setting (that's where "dd.MM.yyyy" comes from!), I would recommend to use that as an additional fallback, but there are 8 "CH" CultureInfos. They disagree on the SortDatePattern and it's unclear which one you'd have to take. The only other source of regional information that I find is System.Globalization.RegionInfo.CurrentRegion, but that one shows the UK region for me, which wouldn't work either.

As a last resort, there's the registry: HKCU\Control Panel\International\ has
β€” User Profile\Languages: en-US de-CH fr-CH
β€” User Profile System Backup\Languages: de-CH en-US
The standard CultureInfo("de-CH") would provide the correct ShortDatePattern as a fallback.

P.S. Other sessions that don't include PowerShell work fine for me β€” very nice work, thank you! It was just bad luck that I hit PowerShell on my first attempt to use Fusion++.

ArgumentOutOfRangeException in DateTimeChartRangeControlClient

While Fusion++ was attempting to parse the logs recorded for an IIS-hosted web-app, it threw this uncaught exception and did not proceed any further:

System.ArgumentOutOfRangeException: The added or subtracted value results in an un-representable DateTime. (Parameter 'value')
   at System.DateTime.AddTicks(Int64 value)
   at System.DateTime.Add(Double value, Int32 scale)
   at System.DateTime.AddMilliseconds(Double value)
   at DevExpress.XtraEditors.DateTimeChartRangeControlClient.NativeValue(Double value)
   at DevExpress.XtraEditors.ChartRangeControlClientBase.GetArgumentRange()
   at DevExpress.XtraEditors.ChartRangeControlClientRange.UpdateWithDataArgumentRange()
   at DevExpress.XtraEditors.ChartRangeControlClientBase.InteractionUpdated()
   at DevExpress.XtraEditors.ChartRangeControlClientBase.CoreClientDelegate.DevExpress.ChartRangeControlClient.Core.IChartCoreClientDelegate.InteractionUpdated()
   at DevExpress.ChartRangeControlClient.Core.ChartCoreClient.DataProviderDataChanged(IClientDataProvider provider)
   at DevExpress.XtraEditors.ChartRangeControlClientDataProvider.InternalClientDataProvider.RaiseDataChanged()
   at DevExpress.XtraEditors.ChartRangeControlClientDataProvider.BindingDelegateBindingChanged()
   at DevExpress.XtraEditors.ChartRangeControlClientDataProvider.InternalBindingSourceDelegate.DevExpress.ChartRangeControlClient.Core.IBindingSourceDelegate.BindingChanged()
   at DevExpress.ChartRangeControlClient.Core.BindingSource.RaiseBindingChanged()
   at DevExpress.ChartRangeControlClient.Core.BindingSource.set_ItemsSource(Object value)
   at DevExpress.XtraEditors.ChartRangeControlClientDataProvider.ApplyRealDataSettings()
   at DevExpress.XtraEditors.ChartRangeControlClientDataProvider.UpdateBindingSource(Boolean invalidateRangeControl)
   at FusionPlusPlus.Forms.MainForm.LoadLogsAsync(ILogStore logStore)
   at FusionPlusPlus.Forms.MainForm.LoadLogsAsync(String path)
   at FusionPlusPlus.Forms.MainForm.ImportFromDirectoryAsync(String directory)
   at FusionPlusPlus.Forms.MainForm.<>c__DisplayClass35_1.<<PopulateLastSessions>b__2>d.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Threading.Tasks.Task.<>c.<ThrowAsync>b__139_0(Object state)

The full error message reported by Fusion++ is here: ArgumentOutOfRangeException.txt

And the actual logs in question are here: 2020.04.30.07.37.37.5091.zip

I'm not sure whether this might be related to issue #15. In case it's relevant though, the system-time at which I recorded those logs was 5:37pm in AEST (UTC+10).

Can't build - Requires DevExpress subscription?

This looks like it could be very helpful but I am unable to build it without paying a thousand dollars or more for the DevExpress tools. Is there a workaround?

PS: The code has a dependency on many DevExpress v18.2 asseblies, the current version is 19.x.

Would love to try out this tool, if not for the extreme expense for the requirements.
Bruce.

Publish the tool on winget

It would be awesome if this tool was able to be installed via winget.

I can submit a PR to the winget-pkgs to get it listed!
I did this for msbuild structured log viewer as well: microsoft/winget-pkgs#28191

However, winget currently doesn't support portable executables or zip files. So an actual installer would need to be created first.

Once the initial is put in, the winget-pkgs-bot will keep it updated when you do a release on GitHub.

Sound like a good idea?

ARM64 version

Hi,

First of all, thank you for this tremendously useful tool! It has been part of my troubleshooting toolchain for quite some time 😊

Since Fusion++ is now published self-contained, I wanted to ask if it would be possible to publish an ARM64 package as well. Windows ARM64 is beginning to take off, and the company I work at is now getting first bug reports from customers on ARM64. It would've been great if Fusion++ was available natively on that platform.

Thank you!

Publish self-contain release build.

Now I should install dotnet windows runtime to use this tool. I prefer to have bundled runtime via self-contains publish if it is possible.

install as service

hi,

can you provide this as a windows service.

the idea. we are running tests in teamcity, it would be super cool to enalbed disable fuslog and be able to export the data and make it availabel during build. So users can quickly investigate whats going on

thanks

UX request - Add open session to title

Since you can only have one session open at a time per Fusion++ instance, it would be helpful to add the session name to the title. It's easy to lose track while switching through several sessions, because there's no visual indicator for the name of the currently open session.

Cannot build - NuGet not available: DevExpress.RichEdit.Core 18.2.7

I was not able to build because Visual Studio could not get:
DevExpress.RichEdit.Core 18.2.7
I could not find it on NuGet.

Here is what VS said:

Restoring NuGet packages...
To prevent NuGet from restoring packages during build, open the Visual Studio Options dialog, click on the NuGet Package Manager node and uncheck 'Allow NuGet to download missing packages during build.'
NuGet Package restore failed for project Fusion++: NuGet.Protocol.Core.Types.FatalProtocolException: Unable to find version '18.2.7' of package 'DevExpress.RichEdit.Core'.

Fusion++ did not work(log folder lack of permission)

I have tried with fusion++ 1.1 and 1.2, both of them did not work. I click record and open an IIS site, and the site reproduce an exception "Could not load file or assembly". Then I click stop, but the software told me "Relax no data yet".
How can I troubleshooting this, I did not find any log under Fusion++.

Can't run on Win7 32-bit

Windows error:
The version of this file is not compatible with the version of Windows you're running. Check your computer's system information to see whether you need an x86 (32-bit) or x64 (64-bit) version of the program, and then contact the software publisher.

This is where I need the Fusion log viewer: on a VM to test that I have all dependencies included in my build and to help find the missing ones.

Am I missing something or can I really not run the app in this environment?

Support WhereRefBind log entries

I've been using Fusion++ today, it's a great tool!

I noticed that it looks like it may not support all entries. Specifically if I run fuslogvw.exe and specify log all binds to disk, I may get files with this format: WhereRefBind!Host=(LocalMachine)!FileName=(Microsoft.Build.NuGetSdkResolver.dll).htm

These don't seem available in Fusion++.

To get a repro:

  1. git clone https://github.com/dotnet/msbuild (assuming you cloned into C:\MSBuild), checkout main as of 2021-03-24 (e.g. dotnet/msbuild@bf0b0c5)
  2. build -bl /p:CreateBootstrap=true
  3. C:\msbuild\artifacts\bin\bootstrap\net472\MSBuild\Current\Bin\MSBuild.exe /r C:\temp\net472\net472.csproj where net472.csproj is any dotnet C# project. Note /r is important as the codepaths involve NuGet

Run step 3 under fuslogvw and Fusion++ and compare the results.

dotnet/msbuild#6289 is the issue we're investigating. Looks like we first load an assembly using Assembly.LoadFrom(), which loads it into the LoadFrom context, then we load the same .dll into the default load context, so we have two copies of the assembly loaded from two different codepaths, then we get the exception.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    πŸ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. πŸ“ŠπŸ“ˆπŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❀️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.