5

Tengo una llamada OutputDebugString "rogue" en mi aplicación que imprime "T", pero no puedo localizarla.Depuración de llamadas OutputDebugString en Delphi

¿Es posible de alguna manera establecer punto de interrupción en OutputDebugString -function y ver desde dónde se llama?

estoy usando Delphi 2009.

Respuesta

13

¿Cuántas llamadas a OutputDebugString hay en su proyecto? Puede usar el cuadro de diálogo "Buscar en archivos" para encontrarlos todos, y si no son demasiados, no debería haber un problema.

De lo contrario, podría, por supuesto, utilizar una búsqueda y reemplazar y reemplazar todos OutputDebugString( con raise Exception.Create(.

También puede escribir una función

procedure OutputDebugString(const Str: string); 
begin 
    raise Exception.Create(Str); 
end; 

en una unidad utilizada por cualquier otra unidad en el proyecto. Si solo se declara esta nueva unidad después de Windows.pas en la lista uses, se usará esta nueva función en lugar de Windows.pas.

actualización

Sí, se puede colocar puntos de interrupción en el interior windows.pas. Primero, en su proyecto, vaya a Opciones del proyecto, y bajo Depuración, seleccione "Usar DCU de depuración". A continuación, puede ir a windows.pas y colocar un punto de ruptura en la línea 30769:

procedure OutputDebugString; external kernel32 name 'OutputDebugStringW'; 
+1

Demasiados repartos entre proyectos y componentes ... Ni siquiera estoy seguro de si el mensaje proviene de un código propio o de un tercero. – Harriv

+0

Sí, depurar DCU lo hace. Ahora solo tengo que averiguar cómo establecer la condición ... – Harriv

+2

si no es su código, pero alguna unidad que use (indirectamente) la llamada también podría ir a OutputDebugStringA. – Remko

7
  • ejecutar la aplicación.
  • Póngalo en pausa.
  • Open View/Debug windows/Modules ventana.
  • Busque kernel32.dll. Haga doble clic en él.
  • Buscar OutputDebugStringA. Doble haga clic en él.
  • Se abre la ventana de la CPU. Establezca un punto de interrupción en en la primera línea.
  • Buscar OutputDebugStringW. Doble haga clic en él.
  • Se abre la ventana de la CPU. Establezca un punto de interrupción en en la primera línea.

Hecho.

Ahora cualquier llamada a OutputDebugString desde su aplicación se romperá en el punto de interrupción. También puede activar el inicio de sesión en propiedades de punto de interrupción para registrar la pila de llamadas.

Cuestiones relacionadas