Premiere commit - Omika
This commit is contained in:
@@ -0,0 +1,104 @@
|
||||
====================================================================
|
||||
PROBE HFSQL SHUTDOWN CRASH — OUTIL DE DIAGNOSTIC (SRV-OMIKA)
|
||||
====================================================================
|
||||
|
||||
But
|
||||
---
|
||||
Reproduire, de façon TOTALEMENT indépendante d'Omika.Api, le crash
|
||||
natif du module wd300vm64.dll observé à chaque Stop-Service.
|
||||
|
||||
Cet outil n'utilise NI ASP.NET, NI Generic Host, NI conteneur DI,
|
||||
NI repository Omika, NI RSA/QR/licence. Il ne charge que le provider
|
||||
OLE DB PC SOFT (PCSOFT.HFSQL) via System.Data.OleDb.
|
||||
|
||||
Prérequis
|
||||
---------
|
||||
- Windows PowerShell 5.1 (intégré à Windows) : lancer avec powershell.exe.
|
||||
- Le provider OLE DB PC SOFT (PCSOFT.HFSQL) doit être installé sur la machine.
|
||||
- Compte HFSQL technique autorisé à ouvrir une session sur le serveur ciblé.
|
||||
|
||||
Les 3 modes
|
||||
-----------
|
||||
Mode A — NoConnection
|
||||
Le process ne crée AUCUNE connexion OLE DB puis se termine.
|
||||
=> Contrôle : vérifie que le process ne crashe pas SANS HFSQL.
|
||||
Si ce mode crashe, le problème n'est PAS lié à HFSQL.
|
||||
|
||||
Mode B — OpenClose
|
||||
Crée une OleDbConnection (Provider=PCSOFT.HFSQL), Open(),
|
||||
exécute un SELECT lecture seule, ferme le reader, dispose la
|
||||
commande, Close(), Dispose(), affiche PROBE_TERMINE, quitte.
|
||||
=> Reproduit le cycle minimal open/close sans Omika.Api.
|
||||
Si ce mode crashe à la sortie, le crash est dans le provider
|
||||
lui-même (indépendant d'Omika.Api).
|
||||
|
||||
Mode C — OpenCloseReleasePool
|
||||
Identique au Mode B, puis appelle
|
||||
OleDbConnection.ReleaseObjectPool() avant la sortie.
|
||||
=> Teste si la libération explicite du pool évite le crash.
|
||||
|
||||
Paramètres
|
||||
----------
|
||||
-Mode : NoConnection | OpenClose | OpenCloseReleasePool (obligatoire)
|
||||
-Server : hôte du serveur HFSQL Client/Serveur (obligatoire)
|
||||
-Port : port HFSQL (défaut 4900)
|
||||
-Database : nom de la base/analyse (obligatoire)
|
||||
-User : compte technique HFSQL (obligatoire)
|
||||
-Query : requête SELECT lecture seule (défaut "SELECT 1")
|
||||
|
||||
Le mot de passe N'EST PAS un paramètre : il est demandé de façon
|
||||
interactive (Read-Host -AsSecureString) et n'est jamais affiché.
|
||||
|
||||
Commandes Windows PowerShell 5.1
|
||||
--------------------------------
|
||||
Ouvrir une console PowerShell 5.1 (powershell.exe), puis :
|
||||
|
||||
# MODE A (contrôle, sans HFSQL)
|
||||
powershell.exe -NoProfile -ExecutionPolicy Bypass -File `
|
||||
"C:\Chemin\Vers\probe_hfsql_shutdown_crash.ps1" `
|
||||
-Mode NoConnection -Server SERVEUR -Database BASE -User COMPTE
|
||||
|
||||
# MODE B (open/close)
|
||||
powershell.exe -NoProfile -ExecutionPolicy Bypass -File `
|
||||
"C:\Chemin\Vers\probe_hfsql_shutdown_crash.ps1" `
|
||||
-Mode OpenClose -Server SERVEUR -Port 4900 -Database BASE -User COMPTE
|
||||
|
||||
# MODE C (open/close + ReleaseObjectPool)
|
||||
powershell.exe -NoProfile -ExecutionPolicy Bypass -File `
|
||||
"C:\Chemin\Vers\probe_hfsql_shutdown_crash.ps1" `
|
||||
-Mode OpenCloseReleasePool -Server SERVEUR -Port 4900 -Database BASE -User COMPTE
|
||||
|
||||
Le mot de passe est saisi à l'invite (non affiché).
|
||||
|
||||
Contrôle des événements Windows après chaque exécution
|
||||
------------------------------------------------------
|
||||
Après CHAQUE exécution, vérifier l'Observateur d'événements :
|
||||
|
||||
1. eventvwr.msc > Journaux Windows > Application
|
||||
2. Filtrer / rechercher les événements récents :
|
||||
- "Application Error" (Event ID 1000)
|
||||
- ".NET Runtime" (Event ID 1026)
|
||||
- "Windows Error Reporting" (Event ID 1001)
|
||||
3. Dans les détails, chercher :
|
||||
- module fautif : wd300vm64.dll
|
||||
- code exception : 0xc0000005 ou 0xc0000409
|
||||
|
||||
Ou via commande (après chaque run, noter l'heure) :
|
||||
|
||||
Get-WinEvent -LogName Application -MaxEvents 30 |
|
||||
Where-Object { $_.Id -in 1000,1026,1001 } |
|
||||
Format-List TimeCreated, Id, ProviderName, Message
|
||||
|
||||
Interprétation
|
||||
--------------
|
||||
- MODE A crashe -> le crash n'est PAS spécifique à HFSQL.
|
||||
- MODE B crashe -> le provider PCSOFT.HFSQL crashe à la sortie,
|
||||
indépendamment d'Omika.Api.
|
||||
- MODE C ne crashe pas -> ReleaseObjectPool() (ou l'ordre de libération)
|
||||
change le comportement à la sortie.
|
||||
- Aucun mode ne crashe -> le crash PROD implique l'environnement Omika.Api
|
||||
(DI, hosted services, lifetime) et non le provider seul.
|
||||
|
||||
Ne PAS utiliser : OLE DB Services=-1 ni -2 (cassent PCSOFT.HFSQL).
|
||||
Ne PAS tenter de migration ODBC ici.
|
||||
====================================================================
|
||||
@@ -0,0 +1,159 @@
|
||||
# ============================================================
|
||||
# PROBE HFSQL SHUTDOWN CRASH — diagnostic isolé du crash natif
|
||||
# wd300vm64.dll à la fermeture du process.
|
||||
#
|
||||
# Objectif : reproduire le crash SANS Omika.Api, sans ASP.NET,
|
||||
# sans Generic Host, sans DI, sans repository, sans RSA/QR/licence.
|
||||
#
|
||||
# Compatible Windows PowerShell 5.1 (.NET Framework 4.x).
|
||||
# Aucune dépendance applicative.
|
||||
#
|
||||
# TROIS MODES :
|
||||
# NoConnection : aucune connexion OLE DB (contrôle).
|
||||
# OpenClose : Open + SELECT + Close + Dispose.
|
||||
# OpenCloseReleasePool : idem + OleDbConnection.ReleaseObjectPool().
|
||||
#
|
||||
# Sécurité : le mot de passe est demandé interactivement
|
||||
# (Read-Host -AsSecureString), converti en texte uniquement en
|
||||
# mémoire, puis le BSTR est nettoyé (ZeroFreeBSTR). Ni le mot de
|
||||
# passe ni la chaîne de connexion complète ne sont jamais affichés.
|
||||
# ============================================================
|
||||
|
||||
param(
|
||||
[Parameter(Mandatory = $true)]
|
||||
[ValidateSet('NoConnection', 'OpenClose', 'OpenCloseReleasePool')]
|
||||
[string]$Mode,
|
||||
|
||||
[Parameter(Mandatory = $true)]
|
||||
[string]$Server,
|
||||
|
||||
[int]$Port = 4900,
|
||||
|
||||
[Parameter(Mandatory = $true)]
|
||||
[string]$Database,
|
||||
|
||||
[Parameter(Mandatory = $true)]
|
||||
[string]$User,
|
||||
|
||||
[string]$Query = 'SELECT 1'
|
||||
)
|
||||
|
||||
$ErrorActionPreference = 'Stop'
|
||||
|
||||
Write-Host '=== PROBE HFSQL SHUTDOWN CRASH (PS 5.1) ==='
|
||||
Write-Host "Mode : $Mode"
|
||||
Write-Host "Serveur : ${Server}:${Port}"
|
||||
Write-Host "Base : $Database"
|
||||
Write-Host "Compte : $User"
|
||||
Write-Host ''
|
||||
|
||||
# ------------------------------------------------------------
|
||||
# MODE A : aucune connexion OLE DB n'est créée.
|
||||
# ------------------------------------------------------------
|
||||
if ($Mode -eq 'NoConnection') {
|
||||
Write-Host 'PROBE_TERMINE (NoConnection)'
|
||||
Write-Host '>>> Le process se termine sans avoir touche a HFSQL. <<<'
|
||||
exit 0
|
||||
}
|
||||
|
||||
# ------------------------------------------------------------
|
||||
# Mot de passe interactif (jamais affiché).
|
||||
# ------------------------------------------------------------
|
||||
$secure = Read-Host -Prompt 'Mot de passe HFSQL' -AsSecureString
|
||||
$plain = ''
|
||||
if ($null -ne $secure -and $secure.Length -gt 0) {
|
||||
$bstr = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($secure)
|
||||
try {
|
||||
$plain = [System.Runtime.InteropServices.Marshal]::PtrToStringBSTR($bstr)
|
||||
}
|
||||
finally {
|
||||
# Nettoyage du BSTR (mémoire non managée).
|
||||
[System.Runtime.InteropServices.Marshal]::ZeroFreeBSTR($bstr)
|
||||
}
|
||||
$secure.Dispose()
|
||||
}
|
||||
|
||||
# ------------------------------------------------------------
|
||||
# Construction de la chaîne de connexion (jamais affichée).
|
||||
# ------------------------------------------------------------
|
||||
$csb = New-Object System.Data.OleDb.OleDbConnectionStringBuilder
|
||||
$csb.Provider = 'PCSOFT.HFSQL'
|
||||
$csb.DataSource = "$($Server):$($Port)"
|
||||
$csb['Initial Catalog'] = $Database
|
||||
$csb['User ID'] = $User
|
||||
if ($plain -ne '') {
|
||||
$csb['Password'] = $plain
|
||||
}
|
||||
|
||||
$conn = New-Object System.Data.OleDb.OleDbConnection($csb.ConnectionString)
|
||||
|
||||
# ------------------------------------------------------------
|
||||
# Open()
|
||||
# ------------------------------------------------------------
|
||||
try {
|
||||
$conn.Open()
|
||||
Write-Host "Ouverture OK : $($conn.State)"
|
||||
}
|
||||
catch {
|
||||
Write-Host "ERREUR_OUVERTURE : $($_.Exception.GetType().Name) : $($_.Exception.Message)"
|
||||
try { $conn.Dispose() } catch { }
|
||||
$plain = $null
|
||||
exit 2
|
||||
}
|
||||
|
||||
# ------------------------------------------------------------
|
||||
# SELECT lecture seule, puis fermeture reader / command.
|
||||
# ------------------------------------------------------------
|
||||
$cmd = $null
|
||||
$reader = $null
|
||||
try {
|
||||
$cmd = $conn.CreateCommand()
|
||||
$cmd.CommandText = $Query
|
||||
$reader = $cmd.ExecuteReader()
|
||||
$rows = 0
|
||||
while ($reader.Read()) { $rows++ }
|
||||
Write-Host "SELECT_OK : $rows ligne(s)"
|
||||
}
|
||||
catch {
|
||||
Write-Host "ERREUR_SELECT : $($_.Exception.GetType().Name) : $($_.Exception.Message)"
|
||||
}
|
||||
finally {
|
||||
if ($null -ne $reader) {
|
||||
try { $reader.Close() } catch { }
|
||||
try { $reader.Dispose() } catch { }
|
||||
}
|
||||
if ($null -ne $cmd) {
|
||||
try { $cmd.Dispose() } catch { }
|
||||
}
|
||||
}
|
||||
|
||||
# ------------------------------------------------------------
|
||||
# Close() / Dispose()
|
||||
# ------------------------------------------------------------
|
||||
try {
|
||||
if ($conn.State -eq [System.Data.ConnectionState]::Open) {
|
||||
$conn.Close()
|
||||
}
|
||||
}
|
||||
catch {
|
||||
Write-Host "ERREUR_CLOSE : $($_.Exception.GetType().Name) : $($_.Exception.Message)"
|
||||
}
|
||||
$conn.Dispose()
|
||||
Write-Host 'Connexion close/disposee.'
|
||||
|
||||
# ------------------------------------------------------------
|
||||
# MODE C : ReleaseObjectPool() avant la sortie.
|
||||
# ------------------------------------------------------------
|
||||
if ($Mode -eq 'OpenCloseReleasePool') {
|
||||
[System.Data.OleDb.OleDbConnection]::ReleaseObjectPool()
|
||||
Write-Host 'ReleaseObjectPool() appele.'
|
||||
}
|
||||
|
||||
# ------------------------------------------------------------
|
||||
# Nettoyage mémoire du mot de passe (best effort côté managé).
|
||||
# ------------------------------------------------------------
|
||||
$plain = $null
|
||||
$secure = $null
|
||||
|
||||
Write-Host "PROBE_TERMINE ($Mode)"
|
||||
Write-Host '>>> Le process se termine maintenant. Observer un eventuel crash natif (wd300vm64.dll). <<<'
|
||||
Reference in New Issue
Block a user