Tras realizar una de las migraciones de Qt 4.7.4 a Qt 5.9.4 y hacer las correspondientes cambios según la guia de diseño (aquí tenéis más detalles de la misma: Migrating from Qt4 to Qt5). Nos encontramos que nuestra aplicación terminaba crasheando y no encontrábamos la razón. Tras ir analizando paso a paso que estaba pasando y dónde se iba la memoria, encontramos que el árbol que tengo QTreeWidget, lo tengo decorado con iconos QIcon.
En mi caso, requiero un montón de elementos (+200) en el árbol y siguen creciendo ya que es el elemento central de mi aplicación (un IDE especifico). Para la carga de las imágenes utilizaba recursos internos, inicializados de la siguiente manera:
QStandardItem* myItem = new QStandardItem(tr("Item name"));
myItem->setIcon(QIcon(":/Icons/iconName.png"));
En modo DEBUG este tipo de inicialización llegaba a consumir hasta casi 50MB en memoria por cada elemento del árbol. Tras mucho googlear, encontré en QtCentre.org una entrada similiar (link) y y también el bug relacionado (enlace BUG) (sin correción en el momento que escribo).
Lo que se puede hacer para evitar ese consumo de memoria excesivo, es inicializar el objeto de QIcon utilizando el constructor al que se le pasa un objeto de QPixmap. En el caso anterior sería:
QStandardItem* myItem = new QStandardItem(tr("Item name"));
myItem->setIcon(QIcon(QPixmap(":/Icons/iconName.png")));
Al final, el problema se encuentra con la inicialización del objeto por defecto. Aún haciendo esto, hay que tener ene mente que no estamos haciéndolo igual y tenemos en algún lugar que hacer algún cambio extra en el código. Por ejemplo, en mi caso tuve que en otro lugar hacer un resize de la imagen.
viernes, 5 de abril de 2019
viernes, 1 de marzo de 2019
Cl.exe y Case Sentitivity en Windows (*.cpp: error C1033: cannot open program database '*.pdb')
Esta es la primera entrada que escribo y tiene que ver con los problemas sufridos con Case Sensitivity en Windows. El problema resulta a la hora de mezclar herramientas de Windows con Cygwin u otra consola que emule linux en Windows.
Por si no lo sabéis, desde hace un tiempo Windows permite utilizar case sensitive dentro de su sistema de ficheros. Para Windows por defecto lo deja desactivado, para comprobar si esta activado, podéis utilizar la herramienta fsutils.exe y podéis ir comprobando el estado mediante la siguiente línea:
> fsutil.exe file queryCaseSensitiveInfo "<path>"
El resultado os dirá si el <path> es case sensitive o no. Este atributo lo podéis cambiar con las siguientes líneas:
> fsutil.exe file setCaseSensitiveInfo "<path>" disable
> fsutil.exe file setCaseSensitiveInfo "<path>" enable
Bueno vuelta al problema, si para Windows por defecto es Case Insensitive, en el caso de las herramientas que emulan las terminales de linux en Windows como Cygwin, por defecto es lo contrario, es decir es Case Sensitive cuando creas una carpeta con mkdir u otro comando.
El problema de esta entrada aparece con los directorios Case Sensitive en Windows y la herramienta de compilación cl.exe, concretamente, a mi me ha pasado con el flag \Zi de la propia herramienta que hace que se genere la información de debug. cl.exe a la hora de crear el fichero de salida la ruta para crearlo es case insensitive y toda en minúsculas. Por lo que si tenemos alguna ruta que esté con alguna mayúscula (fijaros que mi carpeta de output se llama /Build/Debug y en mi caso está se había creado con mkdir en cygwin), nos dará fallo, concretamente el siguiente fallo:
> CL /c /nologo /Fd./Build/Debug/ /W3 /DWIN32 /DO_LE /D_CRT_SECURE_NO_WARNINGS /D_SCL_SECURE_NO_WARNINGS /EHs /EHc- /GR /MDd /D_DEBUG /Zi /RTCsu /DMAJOR= /DMINOR= /DBETA= /D__DEBUG__ /D__i386__ /D__safety_integrity_level__=0 /Od /I./Include /Fo./Build/Debug/example.obj ../Src/example.cpp
../Src/example.cpp : fatal error C1033: cannot open program database 'build\debug\vc100.pdb'
Por lo que basta con cambiar el atributo al path tal y como hemos dicho al principio y problema resuelto:
> fsutil.exe file setCaseSensitiveInfo "C:/<mi_ruta>/Build/Debug" disable
Case sensitive attribute on directory C:\myPath\Build is disabled.
Para realizar esto de una manera más rápida, he creado un script para Cygwin que recorre todo el sistema de ficheros desde un punto y hace de manera recursiva el cambio a insensitive, os lo dejo por si lo quereis:
> find.exe <mi_ruta>/ -type d | xargs -I % fsutil.exe file setCaseSensitiveInfo "%" disable
Espero que os sirva y si es así, un comentario dando las gracias tampoco estaría mal.
Por si no lo sabéis, desde hace un tiempo Windows permite utilizar case sensitive dentro de su sistema de ficheros. Para Windows por defecto lo deja desactivado, para comprobar si esta activado, podéis utilizar la herramienta fsutils.exe y podéis ir comprobando el estado mediante la siguiente línea:
> fsutil.exe file queryCaseSensitiveInfo "<path>"
El resultado os dirá si el <path> es case sensitive o no. Este atributo lo podéis cambiar con las siguientes líneas:
> fsutil.exe file setCaseSensitiveInfo "<path>" disable
> fsutil.exe file setCaseSensitiveInfo "<path>" enable
Bueno vuelta al problema, si para Windows por defecto es Case Insensitive, en el caso de las herramientas que emulan las terminales de linux en Windows como Cygwin, por defecto es lo contrario, es decir es Case Sensitive cuando creas una carpeta con mkdir u otro comando.
El problema de esta entrada aparece con los directorios Case Sensitive en Windows y la herramienta de compilación cl.exe, concretamente, a mi me ha pasado con el flag \Zi de la propia herramienta que hace que se genere la información de debug. cl.exe a la hora de crear el fichero de salida la ruta para crearlo es case insensitive y toda en minúsculas. Por lo que si tenemos alguna ruta que esté con alguna mayúscula (fijaros que mi carpeta de output se llama /Build/Debug y en mi caso está se había creado con mkdir en cygwin), nos dará fallo, concretamente el siguiente fallo:
> CL /c /nologo /Fd./Build/Debug/ /W3 /DWIN32 /DO_LE /D_CRT_SECURE_NO_WARNINGS /D_SCL_SECURE_NO_WARNINGS /EHs /EHc- /GR /MDd /D_DEBUG /Zi /RTCsu /DMAJOR= /DMINOR= /DBETA= /D__DEBUG__ /D__i386__ /D__safety_integrity_level__=0 /Od /I./Include /Fo./Build/Debug/example.obj ../Src/example.cpp
../Src/example.cpp : fatal error C1033: cannot open program database 'build\debug\vc100.pdb'
Por lo que basta con cambiar el atributo al path tal y como hemos dicho al principio y problema resuelto:
> fsutil.exe file setCaseSensitiveInfo "C:/<mi_ruta>/Build/Debug" disable
Case sensitive attribute on directory C:\myPath\Build is disabled.
Para realizar esto de una manera más rápida, he creado un script para Cygwin que recorre todo el sistema de ficheros desde un punto y hace de manera recursiva el cambio a insensitive, os lo dejo por si lo quereis:
> find.exe <mi_ruta>/ -type d | xargs -I % fsutil.exe file setCaseSensitiveInfo "%" disable
Espero que os sirva y si es así, un comentario dando las gracias tampoco estaría mal.
Suscribirse a:
Entradas (Atom)
Problemas con python "/usr/bin/env < < python>>: No such file or directory "
Es posible que hayas llegado aquí por un mensaje similar al siguiente: /usr/bin/env: <<python>>: No such file or directory Cu...
-
Esta es la primera entrada que escribo y tiene que ver con los problemas sufridos con Case Sensitivity en Windows . El problema resulta a la...
-
Tras realizar una de las migraciones de Qt 4.7.4 a Qt 5.9.4 y hacer las correspondientes cambios según la guia de diseño (aquí tenéis más de...
-
Es posible que hayas llegado aquí por un mensaje similar al siguiente: /usr/bin/env: <<python>>: No such file or directory Cu...