Message ID | 20180625150121.14291-5-y.karadz@gmail.com (mailing list archive) |
---|---|
State | Superseded, archived |
Headers | show |
Series | Introduce the very basic part of the C API of KS-1.0 | expand |
On Mon, 25 Jun 2018 18:01:18 +0300 "Yordan Karadzhov (VMware)" <y.karadz@gmail.com> wrote: > --- /dev/null > +++ b/kernel-shark-qt/examples/dataload.c > @@ -0,0 +1,80 @@ > +// SPDX-License-Identifier: GPL-2.0 > + > +/* > + * Copyright (C) 2018 VMware Inc, Yordan Karadzhov <y.karadz@gmail.com> > + */ > + > +// C > +#include <stdio.h> > +#include <stdlib.h> > + > +// KernelShark > +#include "libkshark.h" > + > +const char *default_file = "trace.dat"; > + > +int main(int argc, char **argv) > +{ > + // Create a new kshark session. Again, for C files, please use the /* */ comment format. > + struct kshark_context *kshark_ctx = NULL; > + kshark_instance(&kshark_ctx); Shouldn't you check the return value here? > + > + // Open a trace data file produced by trace-cmd. > + bool status; Even though this is an example, please put declarations at the top. Other than that, this looks fine. -- Steve > + if (argc > 1) > + status = kshark_open(kshark_ctx, argv[1]); > + else > + status = kshark_open(kshark_ctx, default_file); > + > + if (!status) { > + kshark_free(kshark_ctx); > + return 1; > + } > + > + // Load the content of the file into an array of entries. > + struct kshark_entry **data = NULL; > + size_t r, n_rows; > + n_rows = kshark_load_data_entries(kshark_ctx, &data); > + > + // Print to the screen the list of all tasks. > + struct kshark_task_list* task = kshark_ctx->tasks; > + while (task) { > + const char *task_str = pevent_data_comm_from_pid(kshark_ctx->pevt, > + task->pid); > + printf("task: %s-%i\n", task_str, task->pid); > + task = task->next; > + } > + > + puts("\n\n"); > + > + // Print to the screen the first 10 entries. > + char *entry_str; > + for (r = 0; r < 10; ++r) { > + entry_str = kshark_dump_entry(data[r]); > + puts(entry_str); > + free(entry_str); > + } > + > + puts("\n...\n"); > + > + // Print the last 10 entries. > + for (r = n_rows - 10; r < n_rows; ++r) { > + entry_str = kshark_dump_entry(data[r]); > + puts(entry_str); > + free(entry_str); > + } > + > + // Free the memory. > + for (r = 0; r < n_rows; ++r) > + free(data[r]); > + > + free(data); > + > + // Close the file. > + kshark_close(kshark_ctx); > + > + // Close the session. > + kshark_free(kshark_ctx); > + > + return 0; > +}
diff --git a/kernel-shark-qt/CMakeLists.txt b/kernel-shark-qt/CMakeLists.txt index 9929937..9ff12a1 100644 --- a/kernel-shark-qt/CMakeLists.txt +++ b/kernel-shark-qt/CMakeLists.txt @@ -33,6 +33,7 @@ message(STATUS "CXX flags : " ${CMAKE_CXX_FLAGS}) message(STATUS "Linker flags : " ${CMAKE_EXE_LINKER_FLAGS}) add_subdirectory(${KS_DIR}/src) +add_subdirectory(${KS_DIR}/examples) if (_DOXYGEN_DOC AND DOXYGEN_FOUND) diff --git a/kernel-shark-qt/build/cmake_clean.sh b/kernel-shark-qt/build/cmake_clean.sh index 57c40a4..acdbb43 100755 --- a/kernel-shark-qt/build/cmake_clean.sh +++ b/kernel-shark-qt/build/cmake_clean.sh @@ -4,6 +4,7 @@ rm cmake_install.cmake rm Makefile rm -rf CMakeFiles/ rm -rf src/ +rm -rf examples/ rm -f ../lib/* rm -f ../src/KsDeff.h rm -f CMakeDoxyfile.in diff --git a/kernel-shark-qt/examples/CMakeLists.txt b/kernel-shark-qt/examples/CMakeLists.txt new file mode 100644 index 0000000..98df9d8 --- /dev/null +++ b/kernel-shark-qt/examples/CMakeLists.txt @@ -0,0 +1,5 @@ +message("\n examples ...") + +message(STATUS "dataload") +add_executable(dload dataload.c) +target_link_libraries(dload kshark) diff --git a/kernel-shark-qt/examples/dataload.c b/kernel-shark-qt/examples/dataload.c new file mode 100644 index 0000000..a5c0ed3 --- /dev/null +++ b/kernel-shark-qt/examples/dataload.c @@ -0,0 +1,80 @@ +// SPDX-License-Identifier: GPL-2.0 + +/* + * Copyright (C) 2018 VMware Inc, Yordan Karadzhov <y.karadz@gmail.com> + */ + +// C +#include <stdio.h> +#include <stdlib.h> + +// KernelShark +#include "libkshark.h" + +const char *default_file = "trace.dat"; + +int main(int argc, char **argv) +{ + // Create a new kshark session. + struct kshark_context *kshark_ctx = NULL; + kshark_instance(&kshark_ctx); + + // Open a trace data file produced by trace-cmd. + bool status; + if (argc > 1) + status = kshark_open(kshark_ctx, argv[1]); + else + status = kshark_open(kshark_ctx, default_file); + + if (!status) { + kshark_free(kshark_ctx); + return 1; + } + + // Load the content of the file into an array of entries. + struct kshark_entry **data = NULL; + size_t r, n_rows; + n_rows = kshark_load_data_entries(kshark_ctx, &data); + + // Print to the screen the list of all tasks. + struct kshark_task_list* task = kshark_ctx->tasks; + while (task) { + const char *task_str = pevent_data_comm_from_pid(kshark_ctx->pevt, + task->pid); + printf("task: %s-%i\n", task_str, task->pid); + task = task->next; + } + + puts("\n\n"); + + // Print to the screen the first 10 entries. + char *entry_str; + for (r = 0; r < 10; ++r) { + entry_str = kshark_dump_entry(data[r]); + puts(entry_str); + free(entry_str); + } + + puts("\n...\n"); + + // Print the last 10 entries. + for (r = n_rows - 10; r < n_rows; ++r) { + entry_str = kshark_dump_entry(data[r]); + puts(entry_str); + free(entry_str); + } + + // Free the memory. + for (r = 0; r < n_rows; ++r) + free(data[r]); + + free(data); + + // Close the file. + kshark_close(kshark_ctx); + + // Close the session. + kshark_free(kshark_ctx); + + return 0; +}
This patch introduces a basic example, showing how to use the C API of KernelShark and open a new session, load a trace data file, produced by trace-cmd, print some data to the screen, cleanup and then exit. Signed-off-by: Yordan Karadzhov (VMware) <y.karadz@gmail.com> --- kernel-shark-qt/CMakeLists.txt | 1 + kernel-shark-qt/build/cmake_clean.sh | 1 + kernel-shark-qt/examples/CMakeLists.txt | 5 ++ kernel-shark-qt/examples/dataload.c | 80 +++++++++++++++++++++++++ 4 files changed, 87 insertions(+) create mode 100644 kernel-shark-qt/examples/CMakeLists.txt create mode 100644 kernel-shark-qt/examples/dataload.c