From 10477a98967b2a65e120c78c09aae947112e56a3 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Wed, 15 May 2019 11:11:26 -0700 Subject: [PATCH] Log every native call to node-pty Part of #71966 --- .../api/node/extHostTerminalService.ts | 2 +- .../terminal/browser/terminalProcessManager.ts | 1 - .../electron-browser/terminalInstanceService.ts | 2 +- .../contrib/terminal/node/terminalProcess.ts | 17 ++++++++++++++--- 4 files changed, 16 insertions(+), 6 deletions(-) diff --git a/src/vs/workbench/api/node/extHostTerminalService.ts b/src/vs/workbench/api/node/extHostTerminalService.ts index bb9505c65f9..7bf6960304c 100644 --- a/src/vs/workbench/api/node/extHostTerminalService.ts +++ b/src/vs/workbench/api/node/extHostTerminalService.ts @@ -504,7 +504,7 @@ export class ExtHostTerminalService implements ExtHostTerminalServiceShape { // Fork the process and listen for messages this._logService.debug(`Terminal process launching on ext host`, shellLaunchConfig, initialCwd, cols, rows, env); - const p = new TerminalProcess(shellLaunchConfig, initialCwd, cols, rows, env, terminalConfig.get('windowsEnableConpty') as boolean); + const p = new TerminalProcess(shellLaunchConfig, initialCwd, cols, rows, env, terminalConfig.get('windowsEnableConpty') as boolean, this._logService); p.onProcessIdReady(pid => this._proxy.$sendProcessPid(id, pid)); p.onProcessTitleChanged(title => this._proxy.$sendProcessTitle(id, title)); p.onProcessData(data => this._proxy.$sendProcessData(id, data)); diff --git a/src/vs/workbench/contrib/terminal/browser/terminalProcessManager.ts b/src/vs/workbench/contrib/terminal/browser/terminalProcessManager.ts index bced2593716..33079c36940 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalProcessManager.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalProcessManager.ts @@ -181,7 +181,6 @@ export class TerminalProcessManager implements ITerminalProcessManager { const isWorkspaceShellAllowed = this._configHelper.checkWorkspaceShellPermissions(); const env = terminalEnvironment.createTerminalEnvironment(shellLaunchConfig, lastActiveWorkspace, envFromConfigValue, this._configurationResolverService, isWorkspaceShellAllowed, this._productService.version, this._configHelper.config.setLocaleVariables); - this._logService.debug(`Terminal process launching`, shellLaunchConfig, initialCwd, cols, rows, env); const useConpty = this._configHelper.config.windowsEnableConpty; return this._terminalInstanceService.createTerminalProcess(shellLaunchConfig, initialCwd, cols, rows, env, useConpty); } diff --git a/src/vs/workbench/contrib/terminal/electron-browser/terminalInstanceService.ts b/src/vs/workbench/contrib/terminal/electron-browser/terminalInstanceService.ts index 812db3a7073..53445235342 100644 --- a/src/vs/workbench/contrib/terminal/electron-browser/terminalInstanceService.ts +++ b/src/vs/workbench/contrib/terminal/electron-browser/terminalInstanceService.ts @@ -54,7 +54,7 @@ export class TerminalInstanceService implements ITerminalInstanceService { } public createTerminalProcess(shellLaunchConfig: IShellLaunchConfig, cwd: string, cols: number, rows: number, env: IProcessEnvironment, windowsEnableConpty: boolean): ITerminalChildProcess { - return new TerminalProcess(shellLaunchConfig, cwd, cols, rows, env, windowsEnableConpty); + return this._instantiationService.createInstance(TerminalProcess, shellLaunchConfig, cwd, cols, rows, env, windowsEnableConpty); } public getDefaultShell(p: Platform): string { diff --git a/src/vs/workbench/contrib/terminal/node/terminalProcess.ts b/src/vs/workbench/contrib/terminal/node/terminalProcess.ts index eb250416998..128576e59fe 100644 --- a/src/vs/workbench/contrib/terminal/node/terminalProcess.ts +++ b/src/vs/workbench/contrib/terminal/node/terminalProcess.ts @@ -13,6 +13,7 @@ import { getWindowsBuildNumber } from 'vs/workbench/contrib/terminal/node/termin import { IDisposable } from 'vs/base/common/lifecycle'; import { IShellLaunchConfig, ITerminalChildProcess } from 'vs/workbench/contrib/terminal/common/terminal'; import { exec } from 'child_process'; +import { ILogService } from 'vs/platform/log/common/log'; export class TerminalProcess implements ITerminalChildProcess, IDisposable { private _exitCode: number; @@ -39,7 +40,8 @@ export class TerminalProcess implements ITerminalChildProcess, IDisposable { cols: number, rows: number, env: platform.IProcessEnvironment, - windowsEnableConpty: boolean + windowsEnableConpty: boolean, + @ILogService private readonly _logService: ILogService ) { let shellName: string; if (os.platform() === 'win32') { @@ -82,7 +84,9 @@ export class TerminalProcess implements ITerminalChildProcess, IDisposable { } private setupPtyProcess(shellLaunchConfig: IShellLaunchConfig, options: pty.IPtyForkOptions): void { - const ptyProcess = pty.spawn(shellLaunchConfig.executable!, shellLaunchConfig.args || [], options); + const args = shellLaunchConfig.args || []; + this._logService.trace('IPty#spawn', shellLaunchConfig.executable, args, options); + const ptyProcess = pty.spawn(shellLaunchConfig.executable!, args, options); this._ptyProcess = ptyProcess; this._processStartupComplete = new Promise(c => { this.onProcessIdReady(() => c()); @@ -150,6 +154,7 @@ export class TerminalProcess implements ITerminalChildProcess, IDisposable { // point but we want to make sure try { if (this._ptyProcess) { + this._logService.trace('IPty#kill'); this._ptyProcess.kill(); } } catch (ex) { @@ -184,6 +189,7 @@ export class TerminalProcess implements ITerminalChildProcess, IDisposable { if (this._isDisposed || !this._ptyProcess) { return; } + this._logService.trace('IPty#write', data); this._ptyProcess.write(data); } @@ -194,7 +200,10 @@ export class TerminalProcess implements ITerminalChildProcess, IDisposable { // Ensure that cols and rows are always >= 1, this prevents a native // exception in winpty. if (this._ptyProcess) { - this._ptyProcess.resize(Math.max(cols, 1), Math.max(rows, 1)); + cols = Math.max(cols, 1); + rows = Math.max(rows, 1); + this._logService.trace('IPty#resize', cols, rows); + this._ptyProcess.resize(cols, rows); } } @@ -209,6 +218,7 @@ export class TerminalProcess implements ITerminalChildProcess, IDisposable { resolve(this._initialCwd); return; } + this._logService.trace('IPty#pid'); exec('lsof -p ' + this._ptyProcess.pid + ' | grep cwd', (error, stdout, stderr) => { if (stdout !== '') { resolve(stdout.substring(stdout.indexOf('/'), stdout.length - 1)); @@ -223,6 +233,7 @@ export class TerminalProcess implements ITerminalChildProcess, IDisposable { resolve(this._initialCwd); return; } + this._logService.trace('IPty#pid'); fs.readlink('/proc/' + this._ptyProcess.pid + '/cwd', (err, linkedstr) => { if (err) { resolve(this._initialCwd);