Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Debugging a script that invokes exiftool.exe hangs #3225

Closed
sba923 opened this issue Mar 4, 2021 · 21 comments
Closed

Debugging a script that invokes exiftool.exe hangs #3225

sba923 opened this issue Mar 4, 2021 · 21 comments
Labels
Area-Debugging Issue-Bug A bug to squash. Resolution-Fixed Will close automatically.

Comments

@sba923
Copy link

sba923 commented Mar 4, 2021

System Details

System Details Output

### VSCode version: 1.53.2 622cb03f7e070a9670c94bae1a45d78d7181fbd4 x64

### VSCode extensions:
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]


### PSES version: 2.3.0.0

### PowerShell version:

Name                           Value
----                           -----
PSVersion                      7.1.2
PSEdition                      Core
GitCommitId                    7.1.2
OS                             Microsoft Windows 10.0.19042
Platform                       Win32NT
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0…}
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1
WSManStackVersion              3.0

Issue Description

When I run the following script under the PowerShell debugger within VScode, it hangs when launching exiftool.exe:

$exiftool = (Get-Command exiftool).Path
Write-Host ("'exiftool' is '{0}' (version {1}) {{MD5={2}}}" -f $exiftool, (Get-Item $exiftool).VersionInfo.ProductVersion, (Get-Filehash -Algorithm MD5 $exiftool).Hash)
$cmd = "{0} -DateTimeOriginal {1}" -f $exiftool, (Join-Path -Path $PSScriptRoot -ChildPath 'foobar.cr2')
Write-Host ("Invoking '{0}'" -f $cmd)
Invoke-Expression $cmd

Expected Behaviour

When running outside of the debugger (in a standalone PowerShell session, or in the VScode terminal), I get the expected results:

'exiftool' is 'c:\usr\wbin\exiftool.exe' (version 12.2.1.0) {MD5=4ECB5A8B4AA893F3ADFD48E8ACEBC669}
Invoking 'c:\usr\wbin\exiftool.exe -DateTimeOriginal S:\powershell\test\foobar.cr2'
Date/Time Original              : 2019:12:25 16:36:30

Actual Behaviour

When run via the debugger (F5 in VScode) the script hangs:

'exiftool' is 'c:\usr\wbin\exiftool.exe' (version 12.2.1.0) {MD5=4ECB5A8B4AA893F3ADFD48E8ACEBC669}
Invoking 'c:\usr\wbin\exiftool.exe -DateTimeOriginal S:\powershell\test\foobar.cr2'

Here's the version of exiftool.exe on my system:

exiftool.zip

Attached Logs

1614863299-c8495592-f210-48e1-a203-cc687e42687b1614861694455 - Copy.zip

@ghost ghost added the Needs: Triage Maintainer attention needed! label Mar 4, 2021
@rjmholt
Copy link
Contributor

rjmholt commented Mar 4, 2021

This may well be a duplicate of #2559.

We did some investigation around that issue but weren't able to determine why exiftool.exe specifically interacts badly with the Integrated Console. Unfortunately, we're not likely to be able to prioritise such a specific bug before other issues we're currently working toward.

@rjmholt rjmholt added Area-Debugging Issue-Bug A bug to squash. labels Mar 4, 2021
@sba923
Copy link
Author

sba923 commented Mar 4, 2021

Even if not a exact duplicate this does look like it's a very close issue.

I was so convinced this could not be specific to exiftool that I didn't bother searching for that in the existing issues 😜

I do understand that this is very specific and thus low priority.

I'll start looking for workarounds... (all my photo/video related tooling relies on exiftool to extra e.g. the 'date taken' from DSLR RAW images...)

@rjmholt
Copy link
Contributor

rjmholt commented Mar 4, 2021

Honestly I'm perplexed as to why this occurs with exiftool. I did look into it with the last issue but couldn't see a good reason (it's basically a self-contained Perl script right?).

Anyway, if it's a bad PSReadLine interaction due to the idiosyncrasies of the Integrated Console, it might be something we can mitigate as we rework the integrated console.

@SydneyhSmith SydneyhSmith removed the Needs: Triage Maintainer attention needed! label Mar 9, 2021
@sba923
Copy link
Author

sba923 commented Dec 27, 2021

As I had to work on my picture/video management scripts during the holidays, I was hit by this issue once again.

Would there be a way to detect that a script is running under the debugger, so that it could be prevented from running there? This way I would just be reminded that I must run the script outside of VScode?

@JustinGrote
Copy link
Collaborator

@sba923 yes, you can
$env:TERM_PROGRAM -eq 'vscode'

@ghost ghost added the Needs: Maintainer Attention Maintainer attention needed! label Jan 24, 2022
@StevenBucher98 StevenBucher98 removed the Needs: Maintainer Attention Maintainer attention needed! label Jan 25, 2022
@sba923
Copy link
Author

sba923 commented Apr 4, 2022

$env:TERM_PROGRAM -eq 'vscode'

I confirm this works, so I'm spreading this all around 😥

if ($env:TERM_PROGRAM -eq 'vscode')
{
    Write-Host -ForegroundColor Red ("This script uses 'exiftool'. It will hang if invoked from VScode.")
    Exit(1)
}

Anything I could do to help getting rid of this issue?

@SeeminglyScience
Copy link
Collaborator

Can you try just pressing any key when it appears stuck? Make sure the terminal is focused (click somewhere inside it) and just press enter. Please let me know if it continues after that.

@sba923
Copy link
Author

sba923 commented Apr 4, 2022

yes it does continue, even after pressing Space or even a!!!

@SeeminglyScience
Copy link
Collaborator

Yeah that checks out. I think I know what's up, we'll get it fixed if it is what I think.

@SeeminglyScience
Copy link
Collaborator

btw as a workaround this does the job:

'' | exiftool -DateTimeOriginal foobar.cr2

Just piping literally anything is enough.

@sba923
Copy link
Author

sba923 commented Apr 6, 2022

btw as a workaround this does the job:

'' | exiftool -DateTimeOriginal foobar.cr2

Just piping literally anything is enough.

Thanks for sharing this workaround.

@sba923
Copy link
Author

sba923 commented Apr 6, 2022

Yeah that checks out. I think I know what's up, we'll get it fixed if it is what I think.

Just curious: could you elaborate on what/where the cause is/lies?

@SeeminglyScience
Copy link
Collaborator

My guess is that whatever way they check to see if they should expect input is getting triggered by the fact that we have Console.ReadKey pending in a different thread. So they see for whatever reason that something is expecting input, and then it assumes it needs to take input, so it waits until it does?

Purely guess work until we change up how readkey works, but I'm fairly confident.

@andyleejordan
Copy link
Member

andyleejordan commented Apr 12, 2022

Hi there, we just released v2022.4.0-preview! Could you please try PowerShell Preview for VS Code and verify this is fixed?

@andyleejordan andyleejordan added the Needs: Fix Verification Please verify the fix for us! label Apr 12, 2022
@sba923
Copy link
Author

sba923 commented Apr 13, 2022

Hi,

What I get with

$exiftool = (Get-Command exiftool).Path
Write-Host ("'exiftool' is '{0}' (version {1}) {{MD5={2}}}" -f $exiftool, (Get-Item $exiftool).VersionInfo.ProductVersion, (Get-Filehash -Algorithm MD5 $exiftool).Hash)
$exiftool_args = @('-DateTimeOriginal', (Join-Path -Path $PSScriptRoot -ChildPath 'foobar.cr2'))
Write-Host ("Invoking '{0} {1}'" -f $exiftool, ($exiftool_args -join ' '))
& $exiftool @exiftool_args

is:

  1. no more hanging
  2. VScode terminal shows a à upon execution -- seems the readline gets a dummy character from somewhere...

image

@andyleejordan
Copy link
Member

Yay! Then this is resolved. I'm aware of the dummy character, there's a race inside PSReadLine that we need to resolve with that project, and so right now we send a dummy character that's just:

        private static readonly ConsoleKeyInfo s_nullKeyInfo = new(
            keyChar: ' ',
            ConsoleKey.DownArrow,
            shift: false,
            alt: false,
            control: false);

Which should be a no-op (but clearly isn't, as you're getting an accented a, and another person is getting a quote).

@andyleejordan andyleejordan added the Resolution-Fixed Will close automatically. label Apr 13, 2022
@andyleejordan andyleejordan moved this from In Progress to Done in Sea Biscuit Apr 13, 2022
@ghost ghost closed this as completed Apr 13, 2022
@ghost
Copy link

ghost commented Apr 13, 2022

This issue has been marked as fixed. It has been automatically closed for housekeeping purposes.

@sba923
Copy link
Author

sba923 commented May 4, 2022

Yay! Then this is resolved. I'm aware of the dummy character, there's a race inside PSReadLine that we need to resolve with that project, and so right now we send a dummy character that's just:

        private static readonly ConsoleKeyInfo s_nullKeyInfo = new(
            keyChar: ' ',
            ConsoleKey.DownArrow,
            shift: false,
            alt: false,
            control: false);

Which should be a no-op (but clearly isn't, as you're getting an accented a, and another person is getting a quote).

Can you please confirm this (the dummy character) is fixed with version 2022.5.0 of the extension and PSReadLine 2.2.5?

@andyleejordan
Copy link
Member

Can you please confirm this (the dummy character) is fixed with version 2022.5.0 of the extension and PSReadLine 2.2.5?

Yes indeed it is!

@sba923
Copy link
Author

sba923 commented May 4, 2022

Can you please confirm this (the dummy character) is fixed with version 2022.5.0 of the extension and PSReadLine 2.2.5?

Yes indeed it is!

Good news! This means I'll no longer need to use the workaround

$result = '' | & $exiftool @exiftool_args

and will be able to use the standard construct instead:

$result = & $exiftool @exiftool_args

Thanks again for the fix. I've been patient 😜.

@andyleejordan
Copy link
Member

Very patient. Thank you!

This issue was closed.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Area-Debugging Issue-Bug A bug to squash. Resolution-Fixed Will close automatically.
Projects
No open projects
Status: Done
Development

No branches or pull requests

7 participants