2010-05-20 15 views
7

Tengo un archivo fuente en mi proyecto, que tiene más de 65.536 líneas de código (112.444 para ser exactos). Estoy usando una "amalgamación sqlite", que viene en un solo archivo fuente enorme.gran problema de depuración de archivos C

Estoy usando MSVC 2005. Los problemas llegan durante la depuración. Todo compila y enlaces ok. Pero cuando intento entrar en una función con el depurador, muestra una línea de código incorrecta.

Lo interesante es que la diferencia entre el número de línea correcto y el que muestra el depurador es exactamente 65536. Esto me hace sospechar (casi estoy seguro) de algún desbordamiento corto sin firmar.

También sospecho que no es un error en el MSVC. Tal vez sea la limitación del formato de información de depuración. Es decir, el formato de información de depuración utilizado por MSVC almacena los números de línea como cortos de 2 bytes.

¿Se puede hacer algo al respecto (aparte de cortar el archivo grande en varias más pequeñas)?

+4

¿por qué depurar la amalgamación de sqlite? sqlite tiene una distribución adecuada que consiste en muchos archivos separados. –

+0

Si no está roto, no lo amalgame. –

Respuesta

8

De acuerdo con un moderador de MS, este es un problema conocido solo con el depurador (el compilador parece manejarlo bien como usted señaló). Aparentemente, no hay una solución, aparte de usar archivos de código fuente más cortos. Consulte la respuesta oficial a una pregunta muy similar here

0

Si mira la documentación de la información de depuración simbólica, verá el tipo utilizado para los números de línea. Por ejemplo, los parámetros line y column para IDiaSession::findLinesByLinenum son del tipo DWORD.

Editar: Como señala @valdo, eso todavía no significa que el depurador funciona correctamente con enormes números de línea. Entonces debes usar archivos más cortos. Es desafortunado que tal limitación exista, pero incluso si no hubiera, aún así te recomendaría que dividieras tu fuente.

+0

Bueno, permítanme estar en desacuerdo. El hecho incluso de que las interfaces IDiaSession/IDialSession se declaren con parámetros DWORD no significa que la información * real * de depuración esté almacenada con números de línea DWORD. La interfaz puede estar diseñada para admitir números de línea más grandes, no necesariamente implementada. – valdo

0

A menos que esté modificando SQLite, solo debe confiar en que está haciendo su trabajo. No hay necesidad de intervenir en absoluto. SQLite se ejecuta a través de una gran batería de pruebas antes del lanzamiento.

+2

La editorialización como esta debería ser probablemente un comentario sobre la pregunta. Esto no intenta responder a la pregunta del OP, o al problema general inherente en él. –

0

¿Has estudiado el uso de WinDBG? Es bastante capaz ya que el equipo de Windows lo usa para depurar el O/S y hay algunos archivos biiiig allí, o al menos la última vez que lo busqué.

+0

Aún no. Sin embargo, como dije, parece ser la limitación del formato de información de depuración, no algún error en el depurador – valdo

1

Bueno, cuando quería ver cómo funciona sqlite, tomaba las últimas 60000 líneas, las movía a otro archivo y luego # incluía. Eso fue fácil e hizo el truco para mí. Además, si haces eso, ten cuidado de no dividir dentro de #ifdef.

+1

La publicación dice "(aparte de cortar el archivo grande en varios más pequeños)". –

+0

La publicación sí dice eso, pero está perfectamente bien sugerir que las precondiciones o suposiciones de un póster deberían modificarse. Cortar el archivo en tres partes (necesario ahora que la fusión tenga más de 2 * 2^16 líneas) es una solución perfecta para el problema real, que es depurar en código SQLite utilizando un depurador simbólico. Simplemente tuve que hacer eso yo mismo (¿por qué? Porque necesitaba averiguar el motivo, no documentado en cualquier lugar de los documentos SQLite y no mencionado en ningún otro lugar que pudiera encontrar, que una determinada función SQLite estaba fallando; me enteré en 5 minutos). –

0

Para cualquier persona que tenga problemas con los números de línea incorrectos para archivos < 65.536 líneas: He encontrado mi problema era debido a finales de línea inconsistentes en el archivo de origen. Hubo 129 \r líneas nuevas donde el resto del archivo era \r\n style. La diferencia entre la línea del depurador y la línea correcta también era 129.

Cuestiones relacionadas