Tôi có một thư viện được viết bằng C với glib/gobject. Nó tạo ra số lượng đáng kể thông tin gỡ lỗi qua cuộc gọi g_debug()
. Thông tin này rất hữu ích để khắc phục sự cố, tuy nhiên tôi không muốn nó được hiển thị, khi thư viện được bao gồm trong ứng dụng thực tế. Vì vậy, về cơ bản tôi cần một cách để kiểm soát/lọc số lượng thông tin gỡ lỗi và tôi không thể tìm ra cách nó phải làm việc với glib. Ai đó có thể chỉ cho tôi đi đúng hướng không?Làm thế nào để kiểm soát mức độ thông tin gỡ lỗi trong glib?
Trả lời
Bạn có thể thử đặt biến môi trường G_DEBUG
như được đề cập trong trang web nhà phát triển GLib
. Vui lòng tham khảo phần Environment variable
dưới Running and debugging GLib Applications
trong http://developer.gnome.org/glib/2.28/glib-running.html.
EDIT: Cập nhật để đặt trình ghi nhật ký trong mã. Bạn có thể sử dụng g_log_set_handler
(http://developer.gnome.org/glib/2.29/glib-Message-Logging.html#g-log-set-handler) để thực hiện việc này trong mã của mình. Ban đầu, bạn có thể đặt trình xử lý nhật ký thành hàm giả hiển thị thông báo & sau đó bạn có thể đặt trình xử lý nhật ký thành g_log_default_handler
dựa trên đối số được truyền cho đặt mức nhật ký thích hợp. Để thiết lập các mức log ở trên một mức thiết lập, bạn sẽ cần phải thao tác các giá trị GLogLevelFlags
theo nhu cầu của bạn.
Hy vọng những mẫu mã dưới đây sẽ cung cấp một số gợi ý
#include <glib.h>
#include <stdio.h>
#include <string.h>
#define G_LOG_DOMAIN ((gchar*) 0)
static void _dummy(const gchar *log_domain,
GLogLevelFlags log_level,
const gchar *message,
gpointer user_data)
{
/* Dummy does nothing */
return ;
}
int main(int argc, char **argv)
{
/* Set dummy for all levels */
g_log_set_handler(G_LOG_DOMAIN, G_LOG_LEVEL_MASK, _dummy, NULL);
/* Set default handler based on argument for appropriate log level */
if (argc > 1)
{
/* If -vv passed set to ONLY debug */
if(!strncmp("-vv", argv[1], 3))
{
g_log_set_handler(G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, g_log_default_handler, NULL);
}
/* If -v passed set to ONLY info */
else if(!strncmp("-v", argv[1], 2))
{
g_log_set_handler(G_LOG_DOMAIN, G_LOG_LEVEL_INFO, g_log_default_handler, NULL);
}
/* For everything else, set to back to default*/
else
{
g_log_set_handler(G_LOG_DOMAIN, G_LOG_LEVEL_MASK, g_log_default_handler, NULL);
}
}
else /* If no arguments then set to ONLY warning & critical levels */
{
g_log_set_handler(G_LOG_DOMAIN, G_LOG_LEVEL_WARNING| G_LOG_LEVEL_CRITICAL, g_log_default_handler, NULL);
}
g_warning("This is warning\n");
g_message("This is message\n");
g_debug("This is debug\n");
g_critical("This is critical\n");
g_log(NULL, G_LOG_LEVEL_INFO , "This is info\n");
return 0;
}
Hope this helps!
tôi thực hiện xử lý log tùy chỉnh và đây là cách nó bật ra:
void custom_log_handler (const gchar *log_domain, GLogLevelFlags log_level, const gchar *message, gpointer user_data)
{
gint debug_level = GPOINTER_TO_INT (user_data);
/* filter out messages depending on debugging level */
if ((log_level & G_LOG_LEVEL_DEBUG) && debug_level < MyLogLevel_DEBUG) {
return;
}
else if ((log_level & G_LOG_LEVEL_INFO) && debug_level < MyLogLevel_INFO) {
return;
}
g_printf ("%s\n", message);
}
int main(int argc, char *argv[])
{
...
if (verbose) {
g_log_set_handler (NULL, G_LOG_LEVEL_MASK, custom_log_handler, GINT_TO_POINTER (MyLogLevel_DEBUG));
}
else {
g_log_set_handler (NULL, G_LOG_LEVEL_MASK, custom_log_handler, GINT_TO_POINTER (MyLogLevel_NORMAL));
}
...
}
Tôi hy vọng nó sẽ rất hữu ích cho ai đó :-)
- 1. Làm thế nào để kiểm soát chế độ xây dựng (gỡ lỗi hoặc phát hành) trong cmake?
- 2. Logcat không hiển thị thông báo mức gỡ lỗi
- 3. Lỗi ghi nhật ký để gỡ lỗi và gỡ lỗi, thông tin để stdout với log4j
- 4. Làm thế nào để đăng nhập thông tin gỡ lỗi ssh?
- 5. Thông tin gỡ lỗi DLL của Windows?
- 6. làm cách nào để đặt mức ghi nhật ký thành thông tin cho MongoDb?
- 7. Làm thế nào để cấu hình glib trong Makefile?
- 8. setuptools kiểm tra ẩn lỗi nhập. Làm thế nào để có thông tin tốt hơn?
- 9. Làm thế nào để gỡ lỗi VCL trong véc ni?
- 10. Làm thế nào để kiểm soát độ phân giải camera cho webrtc trong chrome?
- 11. Tạo Qt trong chế độ "Phát hành với thông tin gỡ lỗi"?
- 12. QtCreator: làm thế nào để thiết lập các thông số để gỡ lỗi?
- 13. Làm thế nào để Gỡ lỗi ClojureScript
- 14. WPF: Làm thế nào để vượt qua toàn bộ kiểm soát như CommandParameter thông qua XAML?
- 15. Làm thế nào để kích hoạt chế độ gỡ lỗi đầy đủ trong FastMM4?
- 16. Lỗi ứng dụng .NET không có thông tin gỡ lỗi
- 17. Làm thế nào để Thiết lập ActiveX Tên kiểm soát
- 18. đăng nhập gỡ lỗi kích hoạt kiểm tra trong java
- 19. Làm thế nào để hiển thị thông báo lỗi trong cổng thông tin liferay?
- 20. Trên Ruby on Rails, làm cách nào để in thông tin gỡ lỗi bên trong bộ điều khiển?
- 21. Làm thế nào cầm tay là GLib?
- 22. Trình thông dịch Lua mức độ thấp
- 23. Làm thế nào để bạn gỡ lỗi Java Applet?
- 24. Làm thế nào để gỡ lỗi mã delomboked trong IntelliJ?
- 25. Làm thế nào để chuyển đổi chuỗi để kiểm soát?
- 26. Làm cách nào để gỡ lỗi API thông thạo?
- 27. Chế độ gỡ lỗi và gỡ lỗi trong IDE
- 28. Làm thế nào để gỡ lỗi trong chế độ phát hành?
- 29. Break on _NSLockError() để gỡ lỗi ... Làm thế nào để?
- 30. Làm thế nào để tránh mức độ này đến lỗi radian?
Nó không phải là chính xác những gì tôi đang tìm kiếm. Tất cả tôi muốn để có thể vượt qua -v chỉ có các thông điệp INFO và ở trên được hiển thị và -vv cũng bao gồm gỡ lỗi. Nếu không có tham số nào được cung cấp, chỉ hiển thị CẢNH BÁO và CHÉP. Về cơ bản, những gì tôi đang tìm kiếm là một cách để kiểm soát điều này từ bên trong ứng dụng. Theo tôi hiểu, biến môi trường G_DEBUG là cho các mục đích khác nhau. – dtoux
Cảm ơn @ another.anon.coward. Bây giờ tôi mới nhận thấy bản chỉnh sửa của bạn và đây chính là câu trả lời tôi đang tìm kiếm. Vâng, bởi thời gian này tôi đã thực hiện chính xác giống nhau của bản thân mình nhưng cảm ơn bạn Tuy nhiên ;-) – dtoux